demeter的定律也适用于属性吗?

Mur*_*nze 8 c# design-patterns law-of-demeter

demeter法则说对象不能从对象A中调用对象B中的方法M.但它是否也适用于属性?例?

public class B{
     public bool IsValid();
}

public class A{
     public B B{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?

var isValid = new A().B.IsValid()
Run Code Online (Sandbox Code Playgroud)

或者我应该这样做:

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();
Run Code Online (Sandbox Code Playgroud)

如果我从A访问B的方法,是否存在问题(依法)?

Jor*_*dão 11

是的,它也适用于属性,因为此代码的客户端:

var isValid = new A().B.IsValid();
Run Code Online (Sandbox Code Playgroud)

耦合到A也是B.

在确定Demeter违规法时,您必须平衡脱钩的需要和保持责任明确分开的需要.有时您可以创建Demeter变换器:具有太多不相关方法的类只是为了符合Demeter的规律.

更新:在这篇文章中可以找到Demeter变形器的示例:

例如,考虑一下那个试图亲吻老板的人:sendFlowers(john.getManager().getSpouse()).在此处应用隐藏委托将getManagersSpouse()在Employee中生成一个方法.呸.

  • +1在精心设计的句子中使用变形镜. (4认同)