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中生成一个方法.呸.