Object Thinking (by David West)将 Collaboration 定义为:
- 对象
A
收到对其广告服务之一的请求- 在满足该请求的过程中,它需要从对象
请求服务B
- 对象
醇>B
不
- 占据对象
之一的对象A
的实例变量- 在对象
A
正在执行的方法中声明的临时变量,以满足原始请求- 提供给对象
A
的对象,作为请求服务的消息的参数对象
B
成为协作者,是对象A
的隐蔽助手。
但是,我很难想象出这样一个对象B
。
在下面的代码片段中,helper1
,helper2
或helper3
都不符合上述定义,是吗?
我还认为它并不是要调用B
的静态方法。
class A {
B helper1 = new B();
void service(B helper3) {
B helper2 = new B();
helper1.service();
helper2.service();
helper3.service();
}
}
任何可以举例说明这个定义在实践中会是什么样子的人?
答案 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();
}