【问题标题】:Which is better: Acting on an object or from within an object with a dependency injected?哪个更好:作用于对象还是从注入依赖项的对象内部?
【发布时间】:2014-08-02 01:06:54
【问题描述】:

我一直在努力重构我不久前编写的一些代码,以使其更简洁、更可测试。我可能会在这里分裂头发,但对于下面的场景,我想知道哪种方法更好以及为什么。

所以我有一个观察者来监视我的应用模型创建事件,然后执行一些初始化。在一种情况下,我可以直接调用我的初始化程序,而在另一种情况下,我可以在我的模型上调用 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,因为它允许我做 Initializer 依赖项不做的其他事情。

感谢您提供的任何反馈或您的任何建议。

【问题讨论】:

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


    【解决方案1】:

    选项 2 具有双向依赖性。初始化程序必须知道这两个选项中的应用程序,但在选项 2 中,应用程序必须知道初始化程序。虽然你用过接口,但也没有那么糟糕。

    但从表面上看,如果没有任何其他信息或要求,我会选择选项 1 作为更清洁的选项。

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

    【讨论】:

    • 关于 2 路依赖的非常好的观点。感谢您的反馈!
    【解决方案2】:

    如果您正在构建核心 Business 课程 - 我建议您保持独立。

    如果您正在构建 Utility 或 Helper 类 - 我建议使用依赖注入方法,并让 Utility 类在该对象上执行其“实用”功能。

    根据您的示例代码,您的 Observer 似乎(无论如何对我而言)提供的功能更多的是实用功能而不是核心业务功能 - 所以我建议使用依赖注入路线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多