LoD:调用组件`组件 - 允许或不允许?

时间:2014-05-06 11:21:34

标签: oop design-patterns dependency-injection composition law-of-demeter

是否允许呼叫组件'根据德米特定律的组件?

按组件我的意思是一个对象

  • 这是"专属"注入容器或创建于 容器

  • 与其容器具有相同的生命周期

例如,BrainDog

的一个组成部分
partial class Dog
{
    private readonly IBrain brain;

    public Dog(IBrain brain)
    {
        this.brain = brain;
    }
}

以下是我发现的一些信息:

http://c2.com/cgi/wiki?LawOfDemeter

  

您的方法可以直接在自己的字段上调用方法(但不能在   田野'字段)

     
     

消息目标只能是以下对象之一:

     

...对象的属性

引用的对象

http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/paper-boy/demeter.pdf

  

对象的方法应仅调用以下方法   各种物体:

     

...

     

它创建/实例化的任何对象

     

其直接组件对象


这是一个案例:

partial class Dog
{
    public void Command(string cmd)
    {
        var movement = brain.GetMemory().GetMovement(cmd);

        skeleton.ExecuteMovement(movement);
    }
}

1 个答案:

答案 0 :(得分:1)

  
    

是否允许呼叫组件'根据德米特定律的组件?

  

根据定义,这是不允许的,因为你应该Only talk to your immediate friends

换句话说,IBrain服务不应通过其接口公开其内部服务(假设GetMemory()返回某种类型的IMemory服务)。相反,IBrain接口应该提供一种允许检索运动的方法 - 或者IMemory should be injected directly into Dog`。