我一直在努力重构一些我写过的代码,以便更清洁,更可测试。我可能会在这里分裂,但对于下面的情况,我想知道哪种方法更好,为什么。
所以我有一个观察我的App模型创建事件的Observer,然后执行一些初始化。在一种情况下,我可以直接调用我的初始化程序,而在另一种情况下,我可以在我的模型上调用initialize并传入Initializer对象。
观察员: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,因为它允许我做其他初始化程序依赖不执行的操作。
我感谢您提供的任何反馈,或者您提出的任何建议。
答案 0 :(得分:1)
如果你正在构建核心业务类 - 我建议保持自包含。
如果您正在构建实用程序或帮助程序类 - 我建议使用依赖项注入方法,并让实用程序类执行其功能主义"该对象的功能。
根据你的示例代码,我(无论如何)似乎你的观察者服务于功能性功能而不是核心业务功能 - 所以我推荐依赖注入路径。
答案 1 :(得分:1)
选项2具有双向依赖性。初始化程序必须知道两个选项中的应用程序,但在选项2中,应用程序必须知道初始化程序。虽然你已经使用了界面,但它并没有那么糟糕。
但仍然面对它,没有任何其他信息或要求,我会选择选项1作为清洁选项。
你说选项2允许你做更多,这可能是真的,但我等着看你还需要它做什么。