Mam pytanie dotyczące stosowanych praktyk w programowaniu obiektowym (chciałbym stosować domain model).
Załóżmy że mam takie domeny:
class User implements UserInterface
{
protected $id;
protected $name;
protected $login;
}
class Customer implements CustomerInterface
{
protected $id;
protected $name;
protected $address;
protected $user; // obiekt implementujący UserInterface
}
class Server implements ServerInterface
{
protected $id;
protected $name;
protected $user; // obiekt implementujący UserInterface
}
class ServerAccount implements ServerAccountInterface
{
protected $id;
protected $login;
protected $user; // obiekt implementujący UserInterface
}
do każdego mam napisanego mappera powiedzmy na bazę danych.
Teraz tworząc pojedynczy obiekt Customer setterem wstrzykuje obiekt User by ustawić użytkownika który go dodał (analogicznie w innych domenach)
Teraz pytania jak powinno się rozwiązać następujące kwestie:
1. Jeśli jedno konto może być przypisane do kilku serwerów i jeden serwer może być przypisany do kilku kont to czy robić tak że tworzę osobnego mappera np ServerAccountServerMapper gdzie wstrzykuję obiekt Server i obiekt ServerAccount czy inaczej się to robi?
2. Jak w przypadku operowania na jednej instancji obiektu wszystko cacy ale jak taka praktyka się ma w przypadku np rozbudowanych uprawnień gdzie do jedego usera przypisuję np 150 acl'ek? Przekazywać tablicę obiektów czy tablicę?
3. Jeśli pobieram jeden obiekt domeny np Customer to ustawiam sobie $user jako obiekt typu UserInterface (kto dodał) np poprzez
$Customer = $CustomerMapper->getById(123);
czyli mogę pobrać kto dodał wpis teraz przez:
$addedBy = $Customer->getUser()->getLogin();
Jak to wygląda w przypadku gdy pobieramy pełny raport (na tabelach było by to zapytanie relacyjne na 4 tabelach - users, customers, servers,, server_accounts) gdzie pobieramy m.in. informacje o użytkowniku który dodał poszczególne konta, klientów, serwery. Czyli przy dużej ilości danych jeden user może wystąpić dziesiątki razy bo dodał kilka kont, kilku klientów itp.
Mamy powiedzmy metodę ->fetchFullCustomerReport() - co powinna zwracać taka metoda? Tablicę np asocjacyjną? Tablicę obiektów? Powiedzmy że tablicę obiektów Customer ale co z tymi userami? mam w tej całej zagnieżdżonej strukturze wstrzykiwać ten sam obiekt usera np 100 razy bo user dodał 100 wpisów? Jaki to ma wpływ na wydajność, ilość pamięci itp?
Jak zaleca się to pobierać?
Proszę mnie nie "rzezać" jeśli coś źle piszę, obiektówki się uczę.
pozdrawiam
