Classes en verantwoordelijkheden

Status
Niet open voor verdere reacties.

xplosive

Gebruiker
Lid geworden
23 jan 2009
Berichten
8
Hallo,

Ik heb een vraag over de verantwoordelijkheid die classes hebben. Om een voorbeeld te geven neem ik even een User class. In deze class wordt verschillende data opgeslagen zoals: gebruikersnaam, wachtwoord, id, voornaam, achternaam, enz.

Nu vroeg ik mij af welke verantwoordelijkheden (gedrag) deze class heeft. Is deze class verantwoordelijk voor het ophalen van 1 user? Is deze class verantwoordelijk voor het wijzigen van 1 user?

En dan verder, zijn er voorbeelden te noemen welke verantwoordelijkheden deze class NIET heeft?Ik denk dat bijvoorbeeld het ophalen van alle users (vanuit de DB) niet de verantwoordelijkheid is van de user class, maar van (bijvoorbeeld) users

Ik heb dus moeite om de verantwoordelijkheid/het gedrag van classes te bapalen. Ik hoop dat jullie mijn probleem snappen en kunnen helpen.

Alvast bedankt,

Martijn
 
Alles hangt af van wat je klasse voor functies heeft.

Heb jij een klasse User dan is het voor de hand liggend dat die betrekking heeft op 1 gebruiker.

Heeft die klasse een functie updateSettings dan ligt het ook voor de hand dat hij alleen de gegevens van die ene gebruiker wijzigt.
 
En functies die users verwijderen of ophalen. Waar zou je die dan plaatsen?
 
Die zou ik onder Users plaatsen.
 
Okee, dus alle acties die betrekking hebben op 1 User zet je in de User class en de rest in Users ?

Dus dan zou je enkel de functies Save, Update en Delete (kan dit??) in de User class krijgen...
 
Het verwijderen van een gebruiker zelf kan mogelijk zijn. Als iemand geen lid meer wil zijn o.i.d.

Wellicht zou je dan ook nog get- en setfuncties gebruiken om klasse-variabelen op te halen of te wijzigen.
 
En bijv. de functie die de combinatie van gebruikersnaam en wachtwoord verifieert? Ook onderdeel van de class User ?
 
Okee... Thnx voor zover :)

Mocht ik nog vragen hebben, dan zal ik ze weer posten :)
 
Je kunt ook de verantwoordelijkheid om alle gebruikers (of een groep) op te halen onderdeel maken van de User class mbv een statische methode die een array met User instanties teruggeeft; dan heb je niet 2 verschillende Classes die werken met dezelfde data (namelijk de user-tabel in je database)

Bovendien is het ook wat gebruikersvriendelijker, omdat je maar 1 naam hebt ipv 2.

Maar het is natuurlijk een voorkeur :)
 
Ja, dat kan inderdaad ook. Ik ben hier alleen geen voorstander van. Waarom kan ik niet precies zeggen :p Ik vind het niet echt netjes op de een of andere manier. Maar thnx iig voor je reactie :)
 
Het heeft echt wel voordelen hoor ;)

Zo kun je bijv. bij de private properties van de User class in de statische constructor, waardoor je niet elke User opnieuw hoeft in te laden met een eigen query, maar een query kunt doen en ze dan allemaal in kunt laden :)

Maar kijk zelf maar wat je handiger vindt.
 
Begrijp je niet volledig. Zou je een stukje pseudo code kunnen plaatsen?
 
PHP:
Class Users {
  public function loadUsers( $aList ) {
     foreach ( $aList as $iUser ) {
       $aUsers[] = new User ( $iUser );
     }
     return $aUsers;
  }

}

Class User {
   function __construct( $iUser ) {
      $sSQL = "SELECT * FROM user WHERE id = $iUser";
      $this->aInfo = Database::query ( $sSQL );

  }

}

1 query per user

PHP:
Class User {
  static function loadUsers ( $aUsers ) {
    $sSQL = "SELECT * FROM user WHERE id IN ( ". implode ( $aUsers ) . " )";
    $aUserInfos = Database::query ( $sSQL );

    foreach ( $aUserInfos as $aUser ) {
      $oUser = new User();
      $oUser->aInfo = $aUser;
      $aUsers[] = $oUser;
    }
    return $aUsers;

  }

}

1 query per call, ongeacht het aantal users.

Je kunt hetzelfde geintje ongeveer uithalen met de Users class, maar dan moet je wel álle informatie binnen de User class vrijgeven (Public maken of een Public setter() geven), terwijl je sommige properties misschien Private of Read-only wilt houden... op de tweede methode daarentegen blijft alles netjes Private en afgeschermd maar kun je toch een enorme snelheidswinst boeken omdat je maar 1 query doet.
 
Laatst bewerkt:
Ik heb zelf (shame on me) nog niet veel met OOP gewerkt en het kan dus zijn dat ik me vergis, maar wordt hier niet maar 1 user teruggegeven:

PHP:
     foreach ( $aList as $iUser ) {
       $aUsers = new User ( $iUser );
     }
     return $aUsers;

Zou dat niet moeten zijn:

PHP:
     $aUsers = array();
     foreach ( $aList as $iUser ) {
       $aUsers[] = new User ( $iUser );
     }
     return $aUsers;
 
Ack, dat klopt :/ Tikfoutje, ik ga em even verbeteren.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan