Written by 12:53 Dobre praktyki

Prawo Demeter. 4 zasady projektowania wujka Boba.

Preferuj polimorfizm zamiast if/else czy switch/case

Przed użyciem switch’a zastanów się nad użyciem polimorfizmu, ponieważ wujek Bob przyjmuje zasadę, “jednego switcha”. Czyli jeden switch umieszczony w fabryce. Powinien on tworzyć obiekty polimorficzne, ponieważ zastępują one switch’e w innych miejscach aplikacji.

Rozdziel kod wielowątkowy

Staraj się trzymać te kody oddzielnie, ponieważ zasadniczo się różnią. Różnią się pod względem pisania, utrzymywania, debugowania, ponieważ kiedy wystąpi problem łatwiej jest działać.

Prawo Demeter a wstrzykiwanie zależności

Wstrzykiwanie zależności pozwala na oddzielenie konfiguracji – tworzenia zależności od obiektu, ponieważ obiekt powinien zlecić czemuś większemu (kontenerowi) odpowiedzialność tworzenia ich.

Obiekt zazwyczaj udostępnia tylko konstruktor. Natomiast kontener zajmuje się resztą. Spring Framework – znany przykład kontenera zajmującego się wstrzykiwaniem zależności.

Prawo Demeter w praktyce

Mówi o tym, z jakimi obiektami dana klasa może się komunikować z następującymi obiektami:

  • przekazanymi jako parametr wejściowy
  • stanowiącymi bezpośrednio pole danej klasy
  • dostępnymi globalnie
  • stworzonymi przez daną metodę

Paweł Pluta fajnie przedstawił prawo Demeter (poniższszy przykład): link

Przykład łamiący prawo Demeter. Przedstawiający strukturę firmy. Company ma wiele Depratment’ów. Department ma wiele Team’ów. Team’y mają Members’ów – pracowników.

Spróbujmy obliczyć sumę wynagrodzeń na departament. Poniżej widzimy jak klasa Company wie wszystko(źle). Zna całą strukturę aż do najmniejszego członka – pracownika. Złamane prawo Demeter, ponieważ według niego powinna mieć dostęp tylko do klasy Department, ale nie dalej.

W takim przypadku jedna zmiana spowoduje, że będziemy musieli zmieniać w wielu miejscach. Wykorzystując prawo Demeter musielibyśmy sprawdzić tylko bezpośrednich sąsiadów, ponieważ w tym przypadku tylko klasę Department.

Co można zrobić? Wydelegować obliczanie kosztów do Department’u. Tak naprawdę Department’y mogą inaczej wyliczać wynagrodzenie. Dlatego to dobre podejście.

Poniżej widać, że klasa Company korzysta tylko z metod Department. W związku z tym dzięki przestrzeganiu Demeter, klasa odwołuje się wyłącznie do obiektów, które dobrze zna pod względem wewnętrznej struktury.


Obliczanie wynagrodzenia przenieśliśmy do Deparment’u.


Pisanie kodu spełniającego prawo Demeter, może ulepszyć modyfikowalność i elastyczność projektu. Testowanie i analiza błędów jest utrudniona, gdy klasa wie wszystko.

W paradygmacie zorientowanym obiektowo obiekty mają informować inne obiekty, co mają robić — delegować, zamiast pytać o dane od innych i robić wszystko samemu.

Prawo Demeter, a ilość kropek

Jeśli dana linijka kodu zawiera więcej niż jedną kropkę to znaczy, że kod odwołuje się do zbyt dalekich obiektów. Trzeba się nad nim zastanowić.

A czy Fluent API (dużo kropek) przestrzega prawa Demeter? Tak, bo działamy na tym samym obiekcie. Dlatego ok. Poniżej przykład:


Struktury danych, które nie posiadają zachowań mogą być zwolnione z prawa Demeter!

Ważne! W przestrzeganiu prawa Demeter kieruj się zdrowym rozsądkiem. Jak zawsze. Bądź pragmatycznym programistą.

 
Źródła:

https://pawelpluta.com/the-law-of-demeter-by-example/

http://www.pzielinski.com/?p=1391

Tagi: Last modified: 7 stycznia 2022
Close

PRAKTYCZNE WSKAZÓWKI Z PROGRAMOWANIA W JAVIE W PIGUŁCE

Dołącz do 1000+ programistów Java, czytających praktyczne maile o dobrych praktykach programowania, architekturze mikroserwisowej i gorących newsach (1 raz w tygodniu)

Praktyczna Java

Swój Pakiet Powitalny Wypchany Mięsem Dostaniesz Już Za 15 Minut.

Uzupełnienie powyższego pola stanowi zgodę na otrzymywanie od Kamila Michno newslettera zawierającego treści informacyjnych, marketingowych dotyczących portalu praktycznajava.pl. Zgodę można wycofać w każdym czasie. Wycofanie zgody nie ma wpływu na zgodność z prawem przetwarzania dokonanego przed jej wycofaniem.