2012-12-22 20 views
8

demeter的定律說,一個對象不能從對象A的對象B調用方法M.但是它是否也適用於屬性?例?德米特法也適用於屬性嗎?

public class B{ 
    public bool IsValid(); 
} 

public class A{ 
    public B B{get;set;} 
} 

我可以這樣做嗎?

var isValid = new A().B.IsValid() 

或者我應該這樣做:

public class B{ 
    public bool IsValid(); 
} 

public class A{ 
    private B B{get;set;} 

    public bool IsValid(){ 
      return B.IsValid(); 
    } 
} 

var result = new A().IsValid(); 

有(依法)一個問題,如果我從一個訪問B的方法?

+0

在你的2D示例中,它看起來是由內部的'A'創建的'B'的實例。在你的第一個例子中,它是可以設置「B」的公共屬性。你確切的情況是什麼,所以你需要調用'A.B.IsValid'作爲反對'B.IsValid'?在你的第二個例子中,'get'可以是公開的。 – shahkalpesh

回答

12

是,它適用於性能爲好,因爲該代碼的客戶端:

var isValid = new A().B.IsValid(); 

耦合到A並且還B

在確定德米特違規的規律時,必須平衡脫鉤的需要和明確區分責任的必要性。有時你可以創建Demeter transmogrifiers:爲了符合Demeter的規律,有許多不相關的方法。

更新:一個德米特transmogrifier的例子可以在this post發現:

考慮,例如,人誰是試圖親吻他的上司:sendFlowers(john.getManager().getSpouse())。在這裏應用隱藏委託會在Employee中產生一個getManagersSpouse()方法。呸。

+4

使用製造精良的句子中的變形術者+1。 –

+0

如果代碼像'var someB = new A()。B; bool isValid = someB.IsValid();'? – shahkalpesh

+0

那麼,在我的第二個例子中,A類將是一個變身者,對嗎? – MuriloKunze

相關問題