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のメソッドにアクセスした場合、(法律に従って)問題はありますか?

4

1 に答える 1

11

はい、このコードのクライアントであるため、プロパティにも適用されます。

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

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

デメテル違反の法則を修正するときは、デカップリングの必要性と責任を明確に分離しておく必要性のバランスを取る必要があります。場合によっては、デメテル トランスモグリファイアー (デメテルの法則に従うためだけに、無関係なメソッドが多すぎるクラス) を作成できます。

更新: Demeter トランスモグリファイアーの例は、この投稿にあります。

たとえば、上司にキスしようとしている人を考えてみましょうsendFlowers(john.getManager().getSpouse())。ここで Hide Delegate を適用するとgetManagersSpouse()、Employee にメソッドが生成されます。うん。

于 2012-12-22T21:36:41.020 に答える