Zákon Demeter ( LoD ) [1] je soubor pravidel návrhu pro vývoj softwaru , zejména objektově orientovaných programů , který ukládá omezení na interakci objektů (modulů). Obecně řečeno, Demeterův zákon je speciálním případem volné vazby .
Pravidlo je založeno na principu nejmenších znalostí [1] . Základní myšlenkou je, že objekt by měl mít co nejmenší představu o struktuře a vlastnostech čehokoli (včetně svých vlastních dílčích součástí).
Jednoduše řečeno, každý softwarový modul:
Přirovnání ze života: Pokud chcete, aby pes běžel, je hloupé povelovat jeho tlapkám, je lepší povel dát psovi a on si s tlapkami poradí sám.
Pravidla byla navržena koncem roku 1987 na Northeastern University (Boston, Massachusetts, USA). Název je převzat z projektu Demeter, který využíval myšlenky aspektově orientovaného a adaptivního programování. Projekt byl pojmenován po Demeter , řecké bohyni zemědělství, aby zdůraznil přednosti filozofie programování „zdola nahoru“.
Obecný popis pravidla: Objekt A nesmí mít přímý přístup k objektu C, pokud má objekt A přístup k objektu B a objekt B má přístup k objektu C .
Formálněji, Demeterův zákon pro funkce vyžaduje, aby metoda M objektu O musela volat pouze metody následujících typů objektů [1] :
V praxi by se klientský objekt měl vyhnout volání metod na objektech, které jsou interními členy vrácenými metodou objektu služby.
Pro mnoho moderních objektově orientovaných programovacích jazyků, které používají tečku jako operátor přístupu pro členy, lze zákon přeformulovat jako „Používejte pouze jednu tečku“.
Použití procesu vstřikování závislosti podporuje dodržování Demeterova zákona [2] .
Vícevrstvou architekturu lze také považovat za příklad implementace Demeterova zákona v softwarovém systému. V takové architektuře může kód v každé vrstvě volat kód pouze ve své vlastní a nižší vrstvě. Volání „přes vrstvu“ je porušením vícevrstvé architektury.
Kód abMethod() tedy porušuje zákon Demeter, zatímco kód a.Method() je správný.
Výhody zákona Demeter spočívají v tom, že kód vyvinutý v souladu s tímto zákonem usnadňuje psaní testů [3] , a vyvinutý software má větší opětovné použití kódu, což usnadňuje jeho údržbu. Protože objekty jsou méně závislé na vnitřní struktuře jiných objektů, lze kontejnery objektů měnit bez úpravy volajících (klientů).
Nevýhodou Demeterova zákona je, že někdy vyžaduje vytvoření velkého počtu malých adaptačních metod (delegátů) pro předávání volání metod interním komponentám.