这个' Collaboration'的定义是什么意思?

时间:2018-01-06 15:55:35

标签: oop object

Object Thinking (by David West) Collaboration 定义为:

  
      
  1. 对象A收到对其广告服务之一的请求
  2.   
  3. 在满足该请求的过程中,它需要从对象B
  4. 请求服务   
  5. 对象B      
        
    1. 占据对象A的实例变量
    2. 之一的对象   
    3. 在对象A正在执行的方法中声明的临时变量,以满足原始请求
    4.   
    5. 提供给对象A的对象,作为请求服务的消息的参数
    6.   
  6.         

    对象B成为协作者,是对象A的隐蔽助手。

但是,我很难想象出这样一个对象B

在下面的代码片段中,helper1helper2helper3都不符合上述定义,是吗? 我还认为它并不是要调用B静态方法。

class A {

    B helper1 = new B();

    void service(B helper3) {

        B helper2 = new B();

        helper1.service();
        helper2.service();
        helper3.service();

    }

}

任何可以举例说明这个定义在实践中会是什么样子的人?

1 个答案:

答案 0 :(得分:0)

阅读了“对象思维”一书中的这一部分后,我想一个例子如下:

public class ObjectA
{
    Service service;

    public ObjectA(Service service)
    {
        this.service = service;
    }

    public void ProvideService()
    {
        ObjectB objectB = this.service.DoSomething();
        objectB.DoSomethingElse();
    }
}

public class Service
{
    public ObjectB DoSomething()
    {
        ...
        return objectB;
    }
}

public class ObjectB
{
    public void DoSomethingElse()
    {
        ...
    }
}

此处,ObjectB是合作者。

在书中,作者提到这符合得墨忒耳法则。 Demeter法则规定类ProvideService的方法ObjectA应该只调用以下方法:

  • ObjectA本身
  • ProvideService
  • 创建的对象
  • 作为参数传递给ProvideService
  • 的对象
  • 实例变量ObjectA
  • 中保存的对象

ObjectB不属于上述情况,因此可归类为合作者。

上述方法ProvideService违反了得墨忒耳法,正如作者所述,这种合作应该保持在最低限度。通常这会导致火车残骸代码如下:

public void ProvideService()
{
    this.service.DoSomething().DoSomethingElse();
}