【问题标题】:Is law of demeter aplied to properties too?得墨忒耳定律也适用于属性吗?
【发布时间】:2012-12-22 21:34:38
【问题描述】:

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 的方法,是否有问题(根据法律)?

【问题讨论】:

  • 在您的 2d 示例中,它看起来 B 的实例由 A 在其中创建。在您的第一个示例中,它是一个公共属性,可以通过它设置 B。您的确切情况是什么,以便您有必要致电 A.B.IsValid 而不是 B.IsValid?在您的第二个示例中,get 可以是公开的。

标签: c# design-patterns law-of-demeter


【解决方案1】:

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

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

AB 耦合。

在修复 Demeter 违规行为时,您必须平衡解耦的需要和保持职责明确分离的需要。有时您可以创建 Demeter 变形器:具有太多不相关方法的类只是为了遵守 Demeter 法则。

更新:可以在this post 中找到 Demeter 变形器的示例:

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

【讨论】:

  • 如果代码像var someB = new A().B; bool isValid = someB.IsValid();怎么办?
  • 那么,在我的第二个示例中,A 类将是一个变形器,对吗?
  • @shahkalpesh:得墨忒耳定律是关于耦合的。如果客户需要知道他通常不应该知道的A(在这种情况下为B)的依赖关系,那么这就是违规。
  • @MuriloKunze:不一定。如果违规的结果修复创建了不连贯的代码,它将只是一个变形器。
  • @MuriloKunze:添加了一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多