Hipsterskie prawa i zasady – vol. 1

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ć

4 uwagi do wpisu “Hipsterskie prawa i zasady – vol. 1

Zostaw komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Connecting to %s