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 违规行为时,您必须平衡脱钩的需要和保持责任明确分离的需要。有时您可以创建得墨忒耳变形器:具有太多不相关方法的类只是为了遵守得墨忒耳法则。

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

例如,考虑一个试图亲吻他的老板的人:sendFlowers(john.getManager().getSpouse()). 在此处应用 Hide Delegate 将getManagersSpouse()在 Employee 中产生一个方法。呸。

于 2012-12-22T21:36:41.020 回答