1

假设您有以下内容(遗憾的是,我不允许发布原始代码):

public void foo() {
    MyObject obj = getMyObject();

    bar(obj);
}

public void bar(MyObject obj) {
   Type type = new Type(obj.getOtherObject());
}

foo打电话bar,进来obj。但它不是使用obj,而是在其上调用一个 getter 来检索所需的信息。这违反得墨忒耳定律吗?

写这样的东西会更好:

public void foo() {
    MyObject obj = getMyObject();

    bar(obj.getOtherObject());
}

public void bar(MyOtherObject otherObj) {
   Type type = new Type(otherObj);
}
4

1 回答 1

2

事实上,根据关于得墨忒耳法则的维基:

基本概念是给定对象应尽可能少地假设其他任何事物的结构或属性......

bar假设给定的MyObject(一个如此强耦合的具体类型,再次针对 LoD)有一个名为 的方法getOtherObject,因此您提出的解决方案对假设进行排序,并使代码更接近于遵守 LoD。您可以走得更远,而是提供所需的类型bar

bar(new Type(obj.getOtherObject());

根据您的语言,您可以不传递接口/合同而不是实体类型吗?这会将强耦合转变为松耦合。

当然,如果这都是给定对象的内部内容,那么它可能不会破坏 LoD,因为它是“亲密朋友”:

  • 每个单元应该只对其他单元有有限的了解:只有与当前单元“密切”相关的单元。
  • 每个单位只应与其朋友交谈;不要和陌生人说话。
  • 只与您的直系朋友交谈。

在 OO 中,我认为您的原始代码基于此论点破坏了 LoD:

...对象 A 可以请求对象实例 B 的服务(调用方法),但对象 A 不能“通过”对象 B 访问另一个对象 C 来请求其服务。这样做意味着对象 A 隐含地需要对对象 B 的内部结构有更多的了解。

在我看来,您似乎是obj为了调用而使用getOtherObj. 您提出的代码是一个潜在的解决方案。

于 2011-11-24T10:46:04.043 回答