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();
如果我从A?
访问B的方法,是否存在问题(根据法律规定)答案 0 :(得分:11)
是的,它也适用于属性,因为此代码的客户端:
var isValid = new A().B.IsValid();
与A
以及B
相关联。
在确定Demeter违规法律时,您必须平衡脱钩的需要和明确区分责任的必要性。有时您可以创建Demeter变形器:具有太多不相关方法的类只是为了符合Demeter定律。
更新:可以在this post中找到Demeter变形器的示例:
例如,考虑一下那些试图与老板亲吻的人:
sendFlowers(john.getManager().getSpouse())
。在此处应用隐藏委托将在Employee中生成getManagersSpouse()
方法。呸。