Jednym z mniej znanych i dość mocno zapomnianych – subiektywna opinia – przez środowisko programistów jest prawo Demeter. W potocznym języku – zasada jednej kropki. Cóż to takiego?
Chodzi o to, żeby odwoływać się tylko do najbliższych znajomych. Powiedzmy, że klasa Me zawiera w sobie odwołanie do innej klasy Friend:
Pseudokod
class Me { Friend friend; method() { np. friend.Name; np. friend.GetAge(); } }
Metoda zawarta w powyższej klasie odwołuje się bezpośrednio do obiektu klasy Friend, z którą ma „przyjacielskie” stosunki. A co byłoby, gdyby ta sama metoda odwoływała się nadal do obiektu typu Friend, ale operowałaby na jej znajomym?
Pseudokod
class Me { Friend friend; method() { np. friend.Friend.Name; np. friend.Friend.GetAge(); } }
W tej sytuacji łamiemy prawo Demeter. Odwołujemy się do znajomych naszych znajomych, których bezpośrednio nie znamy – jedyne co nas z nimi łączy to nasz wspólny znajomy. Na powyższym przykładzie ewidentnie widać, że użyliśmy 2 kropek, zamiast jednej. Jak rozwiązać powyższy problem? Otóż na naszym znajomym można stworzyć metody GetAgeOfFriend() oraz GetNameOfFriend(). Wtedy wywołanie będzie wyglądało w następujący sposób:
Pseudokod
class Me { Friend friend; method() { np. friend.GetNameOfFriend(); np. friend.GetAgeOfFriend(); } }
W ten sposób nasz kod będzie zgodny z prawem Demeter. W wielu miejscach można spotkać się z pytaniami dotyczącymi Fluent Interface, czy też LINQ i komentarzach, że łamią one zasadę. W końcu kod, który wygląda np. tak:
collection.Select(c => c.Id).Take(5)
czy tak:
Class something = Class.Make() .SetName() .SetAge() .SetWhatever()
Zawiera wiele kropek. Jednak tak długo, jak odwołujemy się do jednego obiektu lub obiektu tego samego typu, a tak jest w tych przypadkach – nie łamiemy tej zasady 🙂
* Tytuł dość kontrowersyjny, ale taki właśnie ma być
Hej. Dzięki za post. Jedyne czego mi brakuje w tym poście to – dlaczego warto stosować się do tej zasady
Unikamy czasami potężnych zagnieżdżeń, np. Me.Friend.Friend.Cat.Name 🙂
Co w niej hipsterskiego?
Chyba przede wszystkim to, że nie jest mainstreamowa (modna i powszechnie stosowana). Dzięki za komentarz i pozdrawiam! 🙂