【问题标题】:LoD: calling components` components - allowed or not?LoD:调用组件的组件 - 是否允许?
【发布时间】:2014-05-06 11:21:34
【问题描述】:

是否允许根据得墨忒耳定律调用组件的组件?

组件是指一个对象

  • “独占”注入容器或创建于 容器

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

例如,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);
    }
}

【问题讨论】:

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


    【解决方案1】:

    是否允许根据得墨忒耳定律调用组件的组件?

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

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

    【讨论】:

    • IBrain 视为IMemory 的集合(如IList<IMemory>)。你的意思是我们不能调用从集合中检索到的对象的任何成员?它让很多事情变得不可能......
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 2016-02-11
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多