2012-12-22 11 views
8

デメータの法則は、オブジェクト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(); 

を私はAからBのメソッドにアクセスした場合(法律による)問題ありませんか?

+0

2dの例では、内部に 'A'によって作成された' B'のインスタンスを探します。第1の例では、 'B'を設定することができるpublicプロパティです。あなたは 'B.IsValid'に対して' A.B.IsValid'を呼び出すことが必要になっているので、あなたの正確なシナリオは何ですか? 2番目の例では、 'get'を公開することができます。 – shahkalpesh

答えて

12

はい、それは、このコードのクライアントので、同様の特性に適用される:

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

BにもAに結合されています。

デメテル違反の法律を修正するときは、デカップリングの必要性と責任を明確に区別する必要性とのバランスをとる必要があります。時にはDemeter transmogrifiersを作成することもできます:Demeterの法則を遵守するためにあまりにも多くの無関係なメソッドを持つクラス。

更新:デメテルのtransmogrifierの例はthis postで見つけることができます:sendFlowers(john.getManager().getSpouse())

は、例えば、彼の上司までキスをしようとしている誰かを考えてみましょう。ここでHide Delegateを適用すると、EmployeeにgetManagersSpouse()メソッドが生成されます。ヤック

+4

+1は、細工された文章で変形旋律を使用するためのものです。 –

+0

コードが 'var someB = new A()。B 'のようなものならどうなりますか? bool isValid = someB.IsValid(); '? – shahkalpesh

+0

私の2番目の例では、Aクラスは変形矯正者でしょうか? – MuriloKunze

関連する問題