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 thoughts on “Hipsterskie prawa i zasady – vol. 1

    1. Chyba przede wszystkim to, że nie jest mainstreamowa (modna i powszechnie stosowana). Dzięki za komentarz i pozdrawiam! 🙂

Zostaw komentarz

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s