我一直在重构一些我写了一段时间的代码,使其更干净,更易于测试。我可能在这里吹毛求疵,但对于下面的场景,我想知道哪种方法更好,为什么。
所以我有一个观察者观察我的App模型创建事件,然后执行一些初始化。在一种情况下,我可以简单地直接调用我的初始化器,在另一种情况下,我可以在我的模型上调用initialize并传入一个初始化器对象。
The Observer: AppObserver.php
class AppObserver {
private $appInitializer;
public function __construct(InitializerInterface $appInitializer){
$this->appInitializer = $appInitializer;
}
public function created($app) {
// option 1
$this->appInitializer->initialize($app);
// option 2
$app->initialize($this->appInitializer);
}
}
模型:App.php
class App {
...
// option 2
public function initialize(InitializerInterface $initializer){
$initializer->initialize($this);
}
...
}
初始化器:AppInitializer.php
class AppInitializer implements InitializerInterface {
...
public function initialize($app){
$this->generateIdHash();
$this->generateSecretKey();
$this->setPlatformVersion();
}
...
}
我倾向于选项2,因为它允许我做Initializer依赖项不能做的其他事情。
感谢您提供的任何反馈和建议。
选项2具有双向依赖关系。在两个选项中,初始化器都必须知道应用,但在选项2中,应用必须知道初始化器。虽然你已经使用了一个接口,所以它并没有那么糟糕。
但从表面上看,如果没有任何其他信息或要求,我会选择选项1作为更干净的选项。
你说选项2可以让你做更多的事情,这可能是真的,但我想等一下,看看你还需要它做什么。
如果您正在构建核心业务类-我建议保持其独立。
如果你正在构建Utility或Helper类——我建议使用依赖注入方法,并让Utility类在该对象上执行它的"实用"功能。
根据你的示例代码,看起来(至少对我来说)你的Observer提供的更多是实用功能,而不是核心业务功能——所以我建议使用依赖注入的方式。