Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Relacje między klasami - wątpliwości
Forum PHP.pl > Forum > PHP > Object-oriented programming
rudi23
Na etapie projektowania chodzi mi po głowie coś takiego...
Czy takie podejście jest prawidłowe?? Czy to podchodzi pod jakiś wzorzec projektowy?

Obiekt klasy A zawiera kolekcję złożoną z obiektów klas B.
Przy czym każdy obiekt B ma dostęp do klasy A do której należy.

Kod
class A {
    $_b = array();
    
    public function addB(B $b){
        $b->setA($this);
        $this->_b[] = $b;
    }
}

class B {
    protected $_a;
    
    public function setA(A $a){
        $this->_a = $a;
    }
    
    public function getA(){
        return $this->_a;
    }
}

$a = new A();
$a->addB(new B());
$a->addB(new B());
Sephirus
Ten zapis nie kojarzy mi się z jakimś konkretnym wzorcem projektowym. Od zwykłej kolekcji różni się to jedynie tym, że istnieje ta właśnie referencja czyli relacja pomiędzy obiektem kolekcji a elementami.

Co do prawidłowości podejścia - z tym IMHO jest średnio - nie spotkałem się do końca z zastosowaniem czegoś takiego - co prawda niczemu nie szkodzi przetrzymywać wprost referencje do kolekcji ale do czego jest Ci to potrzebne? Bo ogólnie nie powinno być - może coś źle zaprojektowałeś? Kolekcje powinny udostępniać metody do sprawdzania czy zawierają dany obiekt itp. Dodatkowo elementy kolekcji jak i same kolekcje powinny być od siebie niezależne - W swojej kolekcji tracisz na uniwersalności bo ta kolekcja może jedynie przechowywać elementy/obiekty posiadające metodę ustawiania referencji do głównego obiektu (co w sumie w takim własnie przypadku powinno zostać poparte jakimś interfejsem, który by to wymuszał).

Całość kojarzy mi się z ORM czyli tak jak sam napisałeś relacjami pomiędzy klasami.
Kedan
Ja tam nic zdrożnego nie widzę. Wygląda prawie jak drzewko smile.gif
Niestety istnieje tu niebezpieczeństwo złożoności cyklicznej
  1. class b {
  2. foo() {
  3. $a->bar();
  4. }
  5. }
  6.  
  7. class a {
  8. bar() {
  9. $b->foo();
  10. }
  11. }

więc trzeba uważać co gdzie się wywołuje.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.