Oop 这个'的定义是什么意思;协作';
将协作定义为:Oop 这个'的定义是什么意思;协作';,oop,object,Oop,Object,将协作定义为: 对象A接收对其广告服务之一的请求 在满足该请求的过程中,它需要从对象B 对象B不可用 占用对象A实例变量之一的对象 在方法中声明的临时变量,对象a正在执行以满足原始请求 提供给对象A的对象,作为请求服务的消息的参数 对象B成为合作者,对象a的秘密助手 然而,我很难想象这样一个物体B 在下面的代码片段中,helper1、helper2或helper3都与上述定义不匹配,是吗? 我还假设它并不意味着调用B的静态方法 class A { B helper1 = new B(
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();
}
}
任何人都可以给我一个例子,说明这个定义在实践中是什么样子的?读过《对象思考》一书中的章节后,我认为这个例子如下:
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定律规定,类ObjectA
的方法提供的设备
只能调用以下方法:
public void ProvideService()
{
this.service.DoSomething().DoSomethingElse();
}
本身ObjectA
- 由
ProviderDevice创建的对象
- 作为参数传递给
ProviderDevice
- 在
ObjectA
ObjectB
不属于上述内容,因此可以归类为合作者
上述方法providedevice
违反了德米特法,正如作者所提到的,这种类型的合作应保持在最低限度。这通常会导致列车失事代码如下:
public void ProvideService()
{
this.service.DoSomething().DoSomethingElse();
}
所以书的作者定义了一个合作者对象,说它不是什么?没有其他信息?你有没有理由认为作者不是指静态的?因为将
B
作为单例(但获取实例将使用静态)是合适的示例。不,没有明确的示例说明它是什么。根据书中的信息,我会认为我的helper1
和helper2
是合作者。这就是为什么这个定义让我困惑的原因。我想作者不是指静态方法调用,比如B.staticService()
,因为在我看来,这与书中阐述的理念不符。如果将B
定义为单例,IMO的意见将等同于我的helper2
,即一个临时变量B.getInstance().service()
相当于B helper2=B.getInstance();B.service()
。谢谢您的回答。但我不相信这是什么意思(我也不是说这不是什么意思,因为我不知道)。我不相信,因为在我看来,objectB
是在对象a执行的方法中声明的临时变量,以满足原始请求。@Ward我认为要理解这一点,我们需要将“在方法中声明的临时变量”解释为“由方法创建的临时对象”。我相信,上面的例子是ObjectA和ObjectB可以直接交互的唯一方式,这不是Demeter定律所述的方式之一,即,它是通过引用或指向其他地方创建的对象的指针进行交互。遗憾的是,作者没有包括任何例子,因为这会使它更加清晰。不幸的是,正因为如此,我们不得不进行一些有根据的猜测。@Ward此外,作者还提到“它不是当前驻留在ObjectA封装屏障内的对象”,这也符合上面的代码示例。