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:
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.
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();
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 }
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; } }