哪个更好:在对象上操作,还是在注入依赖项的对象内操作


Which is better: Acting on an object or from within an object with a dependency injected?

我一直在重构一些我写了一段时间的代码,使其更干净,更易于测试。我可能在这里吹毛求疵,但对于下面的场景,我想知道哪种方法更好,为什么。

所以我有一个观察者观察我的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提供的更多是实用功能,而不是核心业务功能——所以我建议使用依赖注入的方式。