W jaki sposób prawo Demeter stosuje się do systemów obiektowych w odniesieniu do sprzęgania i kohezji? [Zamknięte]

15

Jak stosuje się Prawo Demetera do systemów obiektowych ze sprzężeniem i kohezją?

Czytałem książkę „Rozwój oprogramowania i praktyka zawodowa” i natknąłem się na rozdział o LoD i byłem ciekawy, w jaki sposób zasada ta jest stosowana w systemach obiektowych.

Jeremy
źródło
Kiedyś odziedziczyłem projekt, który miał wysoki poziom sprzężenia (topologia gwiazdy). Oczyściłem rzeczy, używając „Wzorca Mediatora”, aby ograniczyć sprzężenie między obiektami i pozwolić mediatorowi mówić do każdego obiektu. Chociaż nadal występuje sprzężenie, ogranicza to liczbę osób. Niektórzy mogą chcieć to zbadać jeszcze bardziej, jeśli uważają, że mają problem z wysokim sprzężeniem z ich projektem.
Jeach

Odpowiedzi:

9

Według Emerson Macedo Prawo Demeter stwierdza co następuje:

  • Każda jednostka powinna mieć ograniczoną wiedzę na temat innych jednostek: tylko jednostki „ściśle” związane z bieżącą jednostką.
  • Każda jednostka powinna rozmawiać tylko z przyjaciółmi; nie rozmawiaj z nieznajomymi.
  • Rozmawiaj tylko z najbliższymi przyjaciółmi.

Odpowiada to bezpośrednio zasadzie niskiego sprzężenia, jak mają to robić jednostki (lub obiekty), podobnie jak powyżej:

  • Nie bądźcie ściśle ze sobą związani. Są tylko najbliżsi.
  • Każdy powinien rozmawiać tylko ze swoimi współpracownikami, a nie ze współpracownikami współpracownika
  • Rozmawiaj tylko z bezpośrednim współpracującym obiektem

Jedną z najniższych form sprzężenia jest przekazywanie wiadomości, tzn. Dane są dzielone między obiektami poprzez wywołania metod z parametrami.

Co więcej, z tego, co widzę, prawo Demetera nie odpowiada bezpośrednio zasadzie wysokiej spójności, ponieważ stwierdza tylko, że same obiekty powinny wiedzieć, jakie dane same posiadają. Obiekt o niskiej spójności ma elementy danych, których nie używa często we własnych metodach. Chodzi bardziej o zawartość obiektu niż o jego relacje i obiekty współpracujące.

Łup
źródło
8

Łączenie, uproszczone

Kiedy obiekt wywołuje metodę, właściwość itp. Innego obiektu, mówimy, że obiekty są sprzężone. Nazywamy to sprzężenie bo teraz wywoływany nie może zmienić nic o swoją własną metodę / propan. w. przerwanie dzwoniącego .

Zatem im bardziej metody sprzęgania, rekwizyty. - tym trudniej jest zmienić kod odbiorcy bez zerwania całego kodu, który go używa.

rozważanie sprzężenia

  • Odwołując się nawet do jednego rekwizytu, metoda łączy dwa obiekty.
  • Oczywiście sprzężenie jest konieczne do tworzenia oprogramowania.
  • Biorąc pod uwagę charakter sprzężenia „krok blokady”, chcemy go zarówno ograniczyć, jak i odizolować. Ten cel jest po prostu zgodny z ogólnym oprogramowaniem. zasady
  • Im mniej obiektów musimy rozmawiać, tym niższe jest sprzężenie.
  • Jeśli muszę, powiedzmy, 20 różnych wywołań metod, sprzężenie jest niższe, jeśli wszystkie 20 wywołań dotyczy jednej klasy / obiektu, odwrotnie te same metody rozłożone na kilka klas / obiektów.

Większość Wiedzy powoduje szalone połączenie

Tutaj mamy coś Employee, co Personma „adres”

public class Employee {
    public Person me = new Person();
}
public class Person {
    public Address home = new Address();
}
public class Address {
    public string street;
} 

Aby dostać się na ulicę Muszę zadzwonić: myEmployee.me.home.street. Jest to 180 stopni sprzeczne z zasadą najmniejszej wiedzy. Muszę wiedzieć o wewnętrznych, struktury kompozytu, z Employee, Personi Addressklas.

Ten wadliwy projekt klasy zmusza mnie do znajomości wszystkich tych klas, a zatem myEmployee.me.home.streetłączy mnie (obiekt wywołujący) z co najmniej 3 klasami - aby uzyskać tylko jedną właściwość!

Najmniejsza wiedza ratuje dzień

Jeśli mówię tylko do Employeeklasy, stosuję zasadę najmniejszej wiedzy per se, robiąc to, automatycznie ograniczamy sprzężenie tylko do tej klasy, a jednocześnie izolujemy sprzężenie do tej jednej klasy.

Dodając wszystkie potrzebne właściwości w Employeeklasie, naprawiamy sprzęgło.

a zatem

public class Employee {
    public Person me = new Person();
    public string street { return me.home.street; }
}

Pozwala mi dzwonić: myEmployee.street-

  1. Ja tylko „wiem” Employee
  2. Jestem sprzężony tylko z Employee- bez względu na to, jak złożona jest jego struktura.

Najmniej wiedzy aż do samego końca

Oddzieliliśmy myEmployee od Personi Address, i najlepiej powinniśmy nadal stosować najmniejszą wiedzę, dodając właściwości przejścia przez takie, że Employeetylko mówi się Personi Persontylko mówiAddress

radarbob
źródło
1

Badanie ( V. Basili, L. Briand i WL Melo. Walidacja obiektowych wskaźników projektowych jako wskaźników jakości ) wykazała, że ​​klasy z większymi zestawami odpowiedzi mają tendencję do tworzenia większej liczby błędów niż klasy z mniejszym zestawem odpowiedzi, ponieważ większy zestaw odpowiedzi oznacza szansę na wyższe sprzężenie.

Wartość Prawa Demetera polega na tym, że zmniejsza on odpowiedź określoną z definicji. Metoda obiektu może wywoływać tylko metodę samą w sobie, dowolny parametr, który został przekazany do metody, metodę dowolnego obiektu, który stworzył i metodę dowolnego bezpośrednio trzymanego obiektu. Ponieważ zestaw odpowiedzi jest mniejszy, istnieje mniejsze prawdopodobieństwo wysokiego sprzężenia. Ponieważ moduł / metoda wykorzystuje tylko dostępne natychmiastowe odniesienia, istnieje większa spójność.

theD
źródło
1
Badanie ( Anquetil, N. i Laval, J. Legacy Restrukturyzacja oprogramowania: analiza konkretnego przypadku ) również wykazało, że zmniejszenie sprzężenia i zwiększenie spójności nie zawsze skutkuje lepszą jakością. Opierając się na wynikach jednego, małego badania uznanego za szkodliwe.
0

To jest dość proste; powiedzmy, że A zależy od B, a B zależy od C. Bez prawa Demetera możesz używać zarówno B, jak i C w A, ale przestrzegając tego prawa, A zależy tylko od B, nie może zależeć od C.

Umożliwia to niskie sprzężenie, ponieważ znacznie zmniejsza liczbę zależności modułu; spójność, choć różni się koncepcyjnie od sprzęgania, osiąga się w ten sam sposób. Mając mniej zależności od modułu, stają się one bardziej szczegółowe dla tego modułu, a tym samym zwiększają spójność. Również całkowita liczba modułów wzrośnie i staną się bardziej wyspecjalizowani w robieniu rzeczy specjalizowanych dla modułu zależnego (w przeciwieństwie do boskich obiektów), co bezpośrednio przekłada się na bardziej spójny system.

m3th0dman
źródło