【问题标题】:What is meant with this definition of 'Collaboration'这个“合作”的定义是什么意思
【发布时间】:2018-06-16 04:17:55
【问题描述】:

Object Thinking (by David West)协作定义为:

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

对象B 成为合作者,对象A 的秘密助手。

但是,我很难想象这样的对象B

在下面的代码片段中,helper1helper2helper3 都不匹配上面的定义,对吗? 我还认为它不是要调用Bstatic 方法。

class A {

    B helper1 = new B();

    void service(B helper3) {

        B helper2 = new B();

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

    }

}

谁能给我一个例子来说明这个定义在实践中的样子?

【问题讨论】:

  • 所以书作者定义了一个 collaborator 对象,说它不是什么?没有其他信息?
  • 您认为作者的意思不是 static 有什么原因吗?因为将B 作为 Singleton(但获取实例将使用 static)可能是合适的示例。
  • 不,没有明确的例子说明它是什么。根据书中的信息,我会认为我的helper1helper2 是合作者。这就是为什么这个定义让我感到困惑。
  • 我认为作者的意思并不是像B.staticService() 这样的静态方法调用,因为IMO 这不符合书中所述的理念。将B 定义为单例将IMO 意见等同于我的helper2,即临时变量B.getInstance().service() 等价于 B helper2 = B.getInstance(); B.service()

标签: oop object


【解决方案1】:

阅读了 Object Thinking 一书中的部分,我认为一个例子如下:

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 是合作者。

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

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

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

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

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

【讨论】:

  • 感谢您的回答。但我不相信这就是意思(我也不是说这不是是什么意思,因为我不知道)。我不相信,因为在我看来,objectB在对象 A 为满足原始请求而执行的方法中声明的临时变量
  • @Ward 我认为要理解这一点,我们需要将“方法中声明的临时变量”解释为“方法创建的临时对象”。我相信,上面的示例是 ObjectA 和 ObjectB 可以直接交互的唯一方式,这不是 Demeter 定律所述的方式之一,即它是通过引用或指向在别处创建的对象的指针的交互。很遗憾作者没有包含任何示例,因为这会使它更加清晰。不幸的是,正因为如此,我们不得不使用一些有根据的猜测。
  • @Ward 此外,作者还提到“它不是当前驻留在 ObjectA 的封装屏障内的对象”,这也适合上面的代码示例。
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2011-04-11
  • 2018-10-29
相关资源
最近更新 更多