我在考慮「實用程序員」中的練習時有一些問題。德米特法 - 實用程序員
它說:
1.
public void showBalance(BankAccount acct) {
Money amt = acct. getBalance() ;
printToScreen(amt .printFormat()) ;
}
變量ACCT傳遞作爲參數,所以爲getBalance呼叫被允許。然而,調用 amt.printFormat()不是。我們不「擁有」所有權,並沒有傳遞給我們。
但我們做自己AMT吧?它在方法和LOD中聲明:當您的方法創建本地對象時,該方法可以調用本地對象上的方法。
這個例子是否打破了LOD?我看到它的方式不是?
2.
public class Colada {
private Blender myBlender;
private Vector myStuff;
public Colada() {
myBlender = new Blender();
myStuff = new Vector() ;
}
private void doSomething() {
myBlender.addlngredients(myStuff.elements());
}
}
由於飄香創建並擁有兩個myBlender和的MyStuff,以addIngredients呼叫和 元件是允許的。
現在我不明白爲什麼doSomething允許調用myBlender和myStuff,因爲它沒有創建它。
3.
void processTransaction(BankAccount acct, int) {
Person *who;
Money amt;
amt.setValue(123.45);
acct.setBalance(amt);
who = acct .getOwner() ;
markWorkflow(who->name(), SET_BALANCE);
}
在這種情況下,擁有processTransaction AMT,則在棧上創建的,ACCT被傳入,所以二者的setValue和的setBalance是允許的。但processTransaction並不擁有誰,所以調用 who-> name()違規。
因此,它確實聲明瞭誰,但不允許調用它。也許我誤解了「擁有」的概念。
有人可以澄清這一點嗎?
謝謝
謝謝,我現在開始瞭解它。在第一個例子中,它實際上是b = a.getBalance; b.printC;所以相當於a.getB.printC。理解LoD也很有趣:[Demeter](http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/paper-boy/demeter.pdf) – Absolem