2017-02-23 61 views
5

Kiedy pracowałem nad moim projektem i musiałem używać wielu obiektów zagnieżdżonych, stałem się bardzo niepewny mojego projektu struktury w Javie, gdy chciałem ustawić zmienną instancji głęboko zagnieżdżonego obiektu z górnego obiektu. Czuję, że brakuje mi podstawowej wiedzy na temat strukturalnego projektowania w Javie. Wgląd w to jest doceniany.Konstrukcja java: powtarzające się metody podobiektów

Wyobraź sobie, że mam obiekt, który ma logiczną strukturę posiadania zagnieżdżonych obiektów podrzędnych jako zmiennych. Na przykład:

Country 
    Capital 
    Palace 
     King 

Jeśli teraz chcesz ustawić private String zmiennej „nameOfKing” King od głównego obiektu (kraju), to muszę definiować każdą metodę we wszystkich wyższych klas Króla. Tak więc coś takiego:

public class Country { 
    private Capital capital; 

    public void setNameOfKing(String n) { 
     capital.setNameOfKing(n); 
    } 
} 

public class Capital{ 
    private Palace palace; 

    public void setNameOfKing(String n) { 
     palace.setNameOfKing(n); 
    } 
} 

public class Palace{ 
    private King king; 

    public void setNameOfKing(String n) { 
     king.setNameOfKing(n); 
    } 
} 

public class King{ 
    private String nameOfKing; 

    public void setNameOfKing(String n) { 
     this.nameOfKing = n; 
    } 
} 

dzięki czemu mogę zadzwonić pod numer country.setNameOfKing(n);. Teraz jest dobrze, jeśli masz tylko kilka zmiennych, ale co jeśli klasy King, Palace, Capital mają wiele innych zmiennych i metod zdefiniowanych i wszystkie z nich muszą być wywołane z kraju. Co jeśli Palace zawiera również inne obiekty klasowe, takie jak (teraz tylko tworzenie rzeczy) ThroneRoom, Treasury, Queen itp. Oznaczałoby to, że dla prawie wszystkich metod w podklasach, musi istnieć klasa Country, która mogłaby potencjalnie oznacza, że ​​musisz stworzyć olbrzymią ilość metod po prostu do przekazywania informacji do obiektów podrzędnych, co prowadzi do bardzo dużej klasy Kraj.

Przypuszczam, że technicznie można powiedzieć, że króla można również określić w samym kraju, rezygnując z dodatkowych metod w Pałacu i Kapitale, ale nadal oznacza to, że metody muszą istnieć w klasie Kraj, a jeśli struktura ta ma sens w zgrupowanych logikach, jakie byłoby najlepsze podejście do tego? Nie jestem pewien, czy jest lepszy sposób, ale nie mogę otrząsnąć się z tego, że coś tu pomijam.

+0

tak 'getPalace(). SetFoo()' nie jest opcją? –

+0

Masz na myśli zmianę metid w klasie Country w ten sposób? 'capital.getPalace().setNameOfKing (n); 'To zmieniłoby fakt, że możesz potencjalnie mieć wiele metod w klasie Country – lokipoki

Odpowiedz

4

To jest problem odpowiedzialności.

Zadaj sobie pytanie: "Kto jest odpowiedzialny za poznanie, kim jest król?". Kiedy jesteś pałacem, czy jesteś odpowiedzialny za króla? Oczywiście, że nie. Królem nie zarządza twój pałac, ale jest on związany z twoim krajem z mocy prawa.

Zapytanie o numer palace.setNameOfKing() jest podobne do pytania o Twój dom, aby nadać noworodkowi imię. Twój dom nie ma takiej odpowiedzialności i nie powinno się na to pozwolić.

Prawidłowym sposobem jest pobranie instancji King i bezpośrednie ustawienie jej nazwy.


Teraz jest problem z tym podejściem: Może trzeba użyć wielu pobierające znaleźć instancję King. Ale możesz rozwiązać ten problem dzięki funkcjonalnemu podejściu do twoich Klas.

palace.getOwner() może zwrócić interfejs Owner z King implements Owner.

Te same zasady można zastosować do innych klas.

+2

Tak, to jest kwestia odpowiedzialności i pójdę o krok dalej i nawet nie pozwolę na ustawienie imienia króla z teoretycznego punktu widzenia poprzez dostarczanie publicznej metody ustawiacza. –

Powiązane problemy