Programování

Demystifikace principu Demeterova principu

Demeterův zákon (nebo princip nejméně znalostí) je vodítkem návrhu pro vývoj softwarových aplikací. Tento princip, který byl poprvé diskutován na Northeastern University v roce 1987, uvádí, že objekt by nikdy neměl znát vnitřní podrobnosti ostatních objektů. Byl navržen tak, aby podporoval volné propojení softwarových návrhů.

Všimněte si, že propojení lze definovat jako stupeň vzájemné závislosti, která existuje mezi softwarovými moduly a jak úzce jsou tyto moduly vzájemně propojeny. Čím více je propojení mezi komponentami v aplikaci, tím těžší je v průběhu času ji upravovat a udržovat. Je vždy dobrým zvykem navrhovat systémy, které lze snáze testovat a udržovat zajištěním volného propojení komponent v aplikaci. Více o soudržnosti a spojování se můžete dozvědět z mého článku zde.

Pochopení principu Demeterova zákona

Princip Demeterova zákona stanoví, že modul by neměl mít znalosti o vnitřních detailech objektů, s nimiž manipuluje. Jinými slovy, softwarová součást nebo objekt by neměla mít znalosti o vnitřním fungování jiných objektů nebo součástí. Pochopme Demeterův zákon na příkladu.

Zvažte tři třídy, jmenovitě - A, B a C - a objekty těchto tříd - objA, objB a objC. Nyní předpokládejme, že objA je závislá na objB, která zase skládá objC. V tomto scénáři může objA vyvolat metody a vlastnosti objB, ale nikoli objC.

Princip zákona Demeter využívá zapouzdření k dosažení této izolace a ke snížení propojení mezi komponentami vaší aplikace. To pomáhá při zlepšování kvality kódu a podporuje flexibilitu a snadnější údržbu kódu. Výhodou dodržování zákona Demeter je, že můžete vytvářet software, který je snadno udržovatelný a přizpůsobitelný budoucím změnám.

Zvažte třídu C, která má metodu M. Předpokládejme, že jste vytvořili instanci třídy C s názvem O. Law of Demeter určuje, že metoda M může vyvolat následující typy .nebo vlastnost třídy by měla vyvolat následující typ pouze členů:

  • Stejný objekt, tj. Samotný objekt „O“
  • Objekty, které byly předány jako argument metodě „M“
  • Místní objekty, tj. Objekty, které byly vytvořeny uvnitř metody „M“
  • Globální objekty, které jsou přístupné objektem „O“
  • Přímé složkové objekty objektu „O“

Zde je seznam kódů, který ilustruje třídu a její členy, kteří dodržují zásadu Demeterova zákona. Kvůli jasnosti jsem zmínil komentáře, kdykoli je to možné.

veřejná třída LawOfDemeterExample

    {

// Toto je instance v oboru třídy

// a tedy k této instanci mají přístup všichni členové této třídy

Instance AnotherClass = nová AnotherClass ();

public void SampleMethodFollowingLoD (testovací objekt)

        {         

Nedělat nic(); // Toto je platné volání, protože voláte metodu stejné třídy

data objektu = obj.GetData (); // To platí také, protože voláte metodu

// na instanci, která byla předána jako parametr

int result = instance.GetResult (); // Toto je také platné volání, protože voláte

// metoda na instanci místně vytvořené

        }

private void DoNothing ()

        {

// Sem napište kód

        }

    }

Zde jsou další dvě třídy, které byste potřebovali ke kompilaci výše uvedeného kódu.

veřejná třída AnotherClass

    {

public int GetResult ()

        {

návrat -1;

        }

    }

test veřejné třídy

    {

veřejný objekt GetData ()

        {

vrátit null;

        }

    }

Nyní se podívejte na třídu LawOfDemeterExample uvedenou výše. Kód je samozřejmý. Možná by vás zajímalo, zda se Demeterův zákon vztahuje pouze na metody. Odpověď je ne". Princip zákona Demeter platí i pro vlastnosti.

Porušení zásad Demeterova zákona

V prvním příkladu kódu vysvětleném dříve jsme zahájili diskusi o tomto tématu dodržováním principu Demeterova zákona. Pojďme pochopit, co se stane, když se nebudeme řídit touto zásadou. Zvažte tento příklad kódu.

var data = new A (). GetObjectB (). GetObjectC (). GetData ();

V tomto příkladu bude klient muset záviset na třídách A, B a C. Jinými slovy je spojen s instancemi tříd A, B a C. Pokud se v budoucnu tyto třídy změní, narazíte na potíže jako vystavujete se změnám, ke kterým může v budoucnu dojít v kterékoli z těchto tříd.