Oop 对象内部的依赖关系
我有这个密码 class Duck { protected $strVocabulary; public function Learn() { $this->strVocabulary = 'quack'; } public function Quack() { echo $this->strVocabulary; } } 班鸭{ 受保护的可撤销美元; 公共职能学习(){ $this->strVocabulary='quack'; } 公共职能庸医{ echo$this->strVocabulary; } } 代码是用PHP编写的,但问题不依赖于PHP。 鸭子在知道嘎嘎叫之前必须先学会Oop 对象内部的依赖关系,oop,design-patterns,Oop,Design Patterns,我有这个密码 class Duck { protected $strVocabulary; public function Learn() { $this->strVocabulary = 'quack'; } public function Quack() { echo $this->strVocabulary; } } 班鸭{ 受保护的可撤销美元; 公共职能学习(){ $this->strVocabulary='quack'; } 公共职能庸医{ echo$
我的问题是:如何使
Quack()
仅在调用Learn()
后才可调用?不,这不违反任何OOP原则
一个突出的例子是对象的行为取决于是否建立了连接(例如,函数doNetworkStuff()
取决于openConnection()
)
在Java中,甚至还有一个在编译时执行此类检查(无论Duck
是否已经Quack()
)的。我经常将此类依赖项作为接口的前提条件,并使用一个转发类,其唯一目的是对其转发到的对象的状态进行protocolling和检查,即对该对象调用了哪些函数的协议,并在不满足前提条件时抛出异常(例如InvalidStateException)
处理这个问题的设计模式是:当对象的内部状态发生变化时,它允许对象改变其行为。对象将显示为更改其类。还使用了上面的示例,即网络连接正在建立或未建立。如果要修复顺序,则可以使用抽象基类,其中在函数quack()中首先调用learn(),然后调用抽象方法doquack()(其他一些好名称,这必须由每个派生类实现) 我的问题是:如何使Quack()仅在Learn()完成后才可调用 有人打电话吗 您可以将关注点分开:
class EnrolleeDuck {
public function Learn() {
return new AlumnusDuck('quack');
}
}
class AlumnusDuck
{
protected $strVocabulary;
public function __construct(&strVocabulary) {
&this->strVocabulary = &strVocabulary;
}
public function Quack() {
echo $this->strVocabulary;
}
}
这是我在PHP中的第一行,请随意更正我不确定我是否理解这个问题。如果你是这么想的话,这两个函数并不相互依赖。它们都修改了
$strvaculary
,但它们并不相互依赖。@Jonathan从功能的角度看,它们是分开工作的,但从逻辑的角度看,首先必须调用learn,然后再调用quack才能得到一些有效的结果。你的问题也是,“我如何使quack只有在调用learn之后才可以调用?”或者你只是说这是你的结构,你将在你的代码中管理方法调用的顺序?@Jonathan-yes(“我如何使江湖医生只有在调用Learn之后才可以调用”)。我也在考虑设计模式,如果这个案例与其中一个模式有任何关联,如果对象可以独立控制其状态,这是一个很好的解决方案。如果一个客户或环境控制着这个州,那就不行了。我同意。如果是那样的话,我会支持州政府。