哪个更好:在一个对象上或从具有依赖注入的对象内进行操作?

时间:2014-08-02 01:06:54

标签: php oop laravel dependency-injection solid-principles

我一直在努力重构一些我写过的代码,以便更清洁,更可测试。我可能会在这里分裂,但对于下面的情况,我想知道哪种方法更好,为什么。

所以我有一个观察我的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,因为它允许我做其他初始化程序依赖不执行的操作。

我感谢您提供的任何反馈,或者您提出的任何建议。

2 个答案:

答案 0 :(得分:1)

如果你正在构建核心业务类 - 我建议保持自包含。

如果您正在构建实用程序或帮助程序类 - 我建议使用依赖项注入方法,并让实用程序类执行其功能主义"该对象的功能。

根据你的示例代码,我(无论如何)似乎你的观察者服务于功能性功能而不是核心业务功能 - 所以我推荐依赖注入路径。

答案 1 :(得分:1)

选项2具有双向依赖性。初始化程序必须知道两个选项中的应用程序,但在选项2中,应用程序必须知道初始化程序。虽然你已经使用了界面,但它并没有那么糟糕。

但仍然面对它,没有任何其他信息或要求,我会选择选项1作为清洁选项。

你说选项2允许你做更多,这可能是真的,但我等着看你还需要它做什么。