12 - Deméteřin zákon

Deméteřin zákon (Law od Demeter – LoD)

Deméteřin zákon nám poskytuje pravidlo ohledně toho, komu (jakým objektům) může objekt zasílat zprávy (tedy volat metody, číst vlastnosti atd.). Někdy bývá také nazýván jako Pravidlo nejmenší znalosti (Principle of least knowledge).

Metoda f třídy C by měla volat jen:

  • Metody třídy C
  • Metody objektů vytvořených metodou f
  • Metody objektů předaných jako argumenty metodě f
  • Metody objektů, které jsou instanční proměnnou třídy C

Někdy se toto formální znění parafrázuje jako „rozmlouvej s přáteli, ne s cizinci“, kde za cizince se považují objekty, ke kterým je nutné získat přístup přes prostředníka.

Motivací tohoto pravidla je co nejpřísnější ukrytí vnitřní struktury objektů, které vede ke snížení provázanosti tříd. Při aplikaci tohoto pravidla každá metoda ví pouze o několika málo metodách blízce příbuzných tříd.

Příklad

Jaká je chyba v následujících ukázkách kódu?

value = object.getX().getY().getTheValue();

x = object.getX();
y = x.getY();
value = y.getValue();

Příklad

Bez znalosti tridy Customer a Wallet reknete jaka je chyba podle kodu v main metode:

payment = 2.00;
Wallet theWallet = myCustomer.getWallet();
if (theWallet.getTotalMoney() > payment) {
  theWallet.subtractMoney(payment);
  //platba probehla uspesne
} else {
  // platbu nelze provest
}

Příklad

Upravte následující kód tak, aby striktně dodržoval Deméteřino pravidlo.

class X {
    void f(Y y) {
        y.getZ().setA(7);
    }
}
 
class Y {
    Z z;
    Z getZ() { return z; }
}
 
class Z {
    int a;
    void setA(int a) { this.a = a; }
}

courses/b6b36omo/labs/lab12.txt · Last modified: 2018/10/03 11:13 (external edit)