Ik zit met OO-ontwerp / efficientie kwestie waarvan ik hoop dat de experts hier mij in de goede richting kunnen sturen 
In PHP(5) ben ik bezig met een relatief simpel systeem, een 7 a 8 classes in totaal. Een aantal classes zijn geassocieerd, bijvoorbeeld Group en User. Group bevat een x aantal users.
Nu wil binnen de applicatie een instance van Group aan kunnen maken en daarbij de Users (objecten) kunnen bijhouden en opvragen in een array. Dus zoiets in een simpele weergave:
Vraag is nu: hoe ga ik nu om met het vullen van de $users array met user objecten?
Roep ik de database aan in de constructor van Group en vul de array daar, zodat als er een nieuw Group object wordt aangemaakt de bijbehorende users meteen beschikbaar zijn? Dit lijkt me nog te overzien als ik alleen kijk naar groups en users, maar als ik het zelfde principe aan hou bij de User class en daar ook weer in de constructor de database aanroep en alle geassocieerde items ophaal (die op hun beurt ook weer alle geassocieerde items ophalen etc.) krijg je een kettingreactie die misschien niet gewild is. Soms wil ik alleen wat weten over een bepaalde group, maar soms wil ik een group object hebben met daarin alle bijbehorende users. Dan lijkt met me niet nodig een stortvloed aan queries te veroorzaken die data ophalen die misschien niet eens gebruikt wordt.
Of maak ik een functie binnen de Group class die op commando de $users array vult en teruggeeft:
Het nadeel hiervan lijkt mij dat als er daadwerkelijk gewerkt moet worden met meerdere associaties je meerdere loops moet gaan construeren om de data gevuld te krijgen. Stel dat van een user ook een geschiedenis (ik noem maar wat) bijgehouden wordt. Om dan alles op te halen:
En dan voor elke associatie die erbij komt weer een loop daarbinnen. Iemand hier suggesties over of misschien een design pattern waar ik wat mee kan?
In PHP(5) ben ik bezig met een relatief simpel systeem, een 7 a 8 classes in totaal. Een aantal classes zijn geassocieerd, bijvoorbeeld Group en User. Group bevat een x aantal users.
Nu wil binnen de applicatie een instance van Group aan kunnen maken en daarbij de Users (objecten) kunnen bijhouden en opvragen in een array. Dus zoiets in een simpele weergave:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Group() { public $naam; public $users; public function __construct() { // } } class User() { $public naam; } |
Vraag is nu: hoe ga ik nu om met het vullen van de $users array met user objecten?
Roep ik de database aan in de constructor van Group en vul de array daar, zodat als er een nieuw Group object wordt aangemaakt de bijbehorende users meteen beschikbaar zijn? Dit lijkt me nog te overzien als ik alleen kijk naar groups en users, maar als ik het zelfde principe aan hou bij de User class en daar ook weer in de constructor de database aanroep en alle geassocieerde items ophaal (die op hun beurt ook weer alle geassocieerde items ophalen etc.) krijg je een kettingreactie die misschien niet gewild is. Soms wil ik alleen wat weten over een bepaalde group, maar soms wil ik een group object hebben met daarin alle bijbehorende users. Dan lijkt met me niet nodig een stortvloed aan queries te veroorzaken die data ophalen die misschien niet eens gebruikt wordt.
Of maak ik een functie binnen de Group class die op commando de $users array vult en teruggeeft:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Group() { public $naam; public $users; public function __construct() { // } public function getUsers() { // haal alle users van deze group op uit de database en vul $this->users } } |
Het nadeel hiervan lijkt mij dat als er daadwerkelijk gewerkt moet worden met meerdere associaties je meerdere loops moet gaan construeren om de data gevuld te krijgen. Stel dat van een user ook een geschiedenis (ik noem maar wat) bijgehouden wordt. Om dan alles op te halen:
PHP:
1
2
3
4
5
| $testgroep = new Group(); foreach ($testgroep->getUsers as $testuser) { $testuser->getHistory(); } |
En dan voor elke associatie die erbij komt weer een loop daarbinnen. Iemand hier suggesties over of misschien een design pattern waar ik wat mee kan?
"We set sail on this new sea because there is new knowledge to be gained and new rights to be won." - John F. Kennedy - USS Valiant NCC-74210 dedication plaque