Wzorce projektowe i zasady #6 - poznanie zasady prawo Demeter (Law of Demeter)

in polish •  7 years ago  (edited)

Witajcie,

dzisiał napiszę wam od dosyć podstawowej zasadzie, która jest nagminnie łamana w Javie.

Jest nią "Prawo Demeter" (Law of Demeter).

Zasada ta mówi, żeby nie rozmawiać z nieznajomymi. Jeżeli chcecie wiedzieć, czemu akurat prawo Demeter, to zapraszam do poczytania mitologii xd

A jak ta zasada ma się do Javy?

Mówiąc wprost i trochę brutalnie - nie chcemy wyrywać wnętrzności z brzucha innych klas i nimi manipulować.

Jak zauważyć, że wypruwamy flaki niewinnej klasie i robimy z niej warkoczyki?

A o tak:


Ciało.getGardło().getSystemPokarmowy().getŻołądek().przetraw().


Jak widzicie coś takiego w kodzie, to ewidentie rozmawiacie z "nieznajomymi".

To prawo ma tutaj powiązania ze wzorcem ekspert, gdzie wybrana klasa wie najlepiej o sobie.No bo przecież nie ma na świecie osoby, co wie wszystko. Tak samo klasy nie powinny być "wszechwiedzące".

No dobra, to jak rozwiązać ten problem?

Jak już mówiłem, wzorzec ekspert(w swojej dziedzinie) wie najlepiej co ma zrobić.Dlatego jeżeli nie wiemy co zrobić z daną informacją, to przekazujemy ją dalej.Możliwe jest też, że posiadamy jakąś klasę "monstrum" lub inaczej - "BOŻĄ KLASĘ".Wtedy stosując wzorzec ekspert oraz wyciągając z kodu pewne metody jesteśmy wstanie utworzyć klasy, wykonujące tylko tę funkcjonalność, na której się znają.Oczywiście w grę wchodzą jeszcze inne wzorce, ale o nich będzie innym czasem.Takie łańcuchy z samymi get get get get, możemy nazywać "chain of responsibility", czyli tzw. łańcuchy odpowiedzialności. Jest taka zasada mówiąca, że każda klasa powinna mieć tylko jedną odpowiedzialność.

Robiąc takie łańcuchy, łamiemy tę zasadę. Jeżeli klasa ma wiele zależności, to zmiana w jednej klasie wpływa na cały program.

Więcej  (o pojedyńczej odpowiedzialności) w poście związanym z zasadą Single responsibility .

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!