Php 哪一个更好:在对象上操作,还是在注入依赖项的对象内操作?
我一直在努力重构我不久前编写的一些代码,使之更干净、更易于测试。我可能在这里吹毛求疵,但对于下面的场景,我想知道哪种方法更好,为什么 所以我有一个观察者观察我的应用程序模型创建的事件,然后执行一些初始化。在一个场景中,我可以直接调用我的初始值设定项,在另一个场景中,我可以在我的模型上调用initialize并传入一个初始值设定项对象 观察者:AppObserver.phpPhp 哪一个更好:在对象上操作,还是在注入依赖项的对象内操作?,php,oop,laravel,dependency-injection,solid-principles,Php,Oop,Laravel,Dependency Injection,Solid Principles,我一直在努力重构我不久前编写的一些代码,使之更干净、更易于测试。我可能在这里吹毛求疵,但对于下面的场景,我想知道哪种方法更好,为什么 所以我有一个观察者观察我的应用程序模型创建的事件,然后执行一些初始化。在一个场景中,我可以直接调用我的初始值设定项,在另一个场景中,我可以在我的模型上调用initialize并传入一个初始值设定项对象 观察者:AppObserver.php class AppObserver { private $appInitializer; public f
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);
}
}
class App {
...
// option 2
public function initialize(InitializerInterface $initializer){
$initializer->initialize($this);
}
...
}
class AppInitializer implements InitializerInterface {
...
public function initialize($app){
$this->generateIdHash();
$this->generateSecretKey();
$this->setPlatformVersion();
}
...
}
模型:App.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);
}
}
class App {
...
// option 2
public function initialize(InitializerInterface $initializer){
$initializer->initialize($this);
}
...
}
class AppInitializer implements InitializerInterface {
...
public function initialize($app){
$this->generateIdHash();
$this->generateSecretKey();
$this->setPlatformVersion();
}
...
}
初始值设定项:AppInitializer.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);
}
}
class App {
...
// option 2
public function initialize(InitializerInterface $initializer){
$initializer->initialize($this);
}
...
}
class AppInitializer implements InitializerInterface {
...
public function initialize($app){
$this->generateIdHash();
$this->generateSecretKey();
$this->setPlatformVersion();
}
...
}
我倾向于选项2,因为它允许我做初始化依赖项不能做的其他事情
我非常感谢您提供的任何反馈和/或任何建议。如果您正在构建核心业务类,我建议保持其独立性 如果您正在构建实用程序或帮助程序类,我建议使用依赖注入方法,让实用程序类在该对象上执行其“实用”功能
根据您的示例代码,您的观察者似乎(在我看来)提供的更多的是实用功能,而不是核心业务功能,因此我推荐依赖注入路线。选项2具有双向依赖性。初始值设定项必须知道两个选项中的应用程序,但在选项2中,应用程序必须知道初始值设定项。虽然您使用了一个接口,但它并没有那么糟糕 但从表面上看,如果没有任何其他信息或要求,我会选择选项1作为更清洁的选项
你说选项2允许你做更多的事情,这可能是真的,但我会等着看你还需要它做什么 关于双向依赖性的观点非常好。谢谢你的反馈!