2011-11-24 49 views
1

假设你有类似于以下(可悲的是,我不能发布原码):此方法调用是否违反Demeter法则?

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

    bar(obj); 
} 

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

foo电话bar,通过在obj。但不是使用obj,而是调用getter来检索所需的信息。这是否违反了德米特法?

它会更好写的是这样的:根据对Law of Demeter维基

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

    bar(obj.getOtherObject()); 
} 

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

回答

2

事实上:

的基本概念是,一个给定的对象应该承担尽可能少 为可能关于其他任何结构或属性...

您的bar假定给定的MyObject(具体类型如此强烈耦合,再次针对LoD)有一个名为getOtherObject的方法,因此您提出的解决方案将假设分类并将代码更接近于遵循LoD。你可以更进一步,而是提供类型bar想:

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

根据你的语言,你能不能传递一个接口/合同代替固态类型的?这会将强耦合变为松散耦合。

当然,如果这是所有内部给定对象,那么也许它没有打破毁灭之王,因为这是一个“密友”:

  • 每个单位应该有大约只有其他单位的知识有限:只有与当前单位“密切”相关的单位。
  • 每个单位只能跟朋友交谈;不要与陌生人交谈。
  • 只与您的直接朋友交谈。

在OO我认为你原来的代码是基于这样的说法打破毁灭之王:

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

对我来说,似乎你正在使用obj为了打电话给getOtherObj。你提出的代码是一个潜在的解决方案

相关问题