智能指针的依赖关系注入是否违反单一责任原则

Does dependency injection by smart pointers violate Single Responsibility Principle?

本文关键字:单一 责任 原则 是否 注入 指针 依赖 关系 智能      更新时间:2023-10-16

我担心的是,当使用shared_ptrunique_ptr时,我坚持使用一种所有权模型 - 要么共享注入的对象,要么共享我自己的对象。我认为这是次要的责任——照顾注入的物体的生命周期。

那么,它是否违反了 SRP - 假设该类已经承担了一些责任

一些简单的例子:

  class Calculator {
  public:
      Calculator(std::unique_ptr<Adder> adder) : adder(adder) {}
      void add();
  private:
      std::unique_ptr<Adder> adder;
  };

当设计发生变化时 - 所以我会有许多不同的计算器 - 那么我需要将unique_ptr更改为shared_ptr.因此,即使Calculator主要职责(计算)没有改变 - 我需要更改类。

对注入的对象使用简单的引用不是更好 - 只是将注入对象的生存期的责任留给其他一些类?

不,我们将成员变量保留在对象中的方式是实现细节,它与单一责任原则等设计原则没有任何关系。

为了说明这一点 - 您可以通过某种私有方法封装对成员的访问 - 这可以防止从unique_ptr更改为shared_ptr时类实现中的更改,反之亦然。


private:
   Adder& add();
   Adder const& add();

或者你可以更进一步,将Adder封装到一些私有对象 - 从而防止它完全意外访问"read"adder变量,例如:

class Calculator 
{
   class AdderProxy
   {
   public:
       using Type = std::unique_ptr<>;
       AdderProxy(AdderType);
       void add(...);    
   };
public:
   Calculator(AdderProxy::Type);
private:
   AdderProxy adder;

或者你可以有一些DI库,比如这个 - 并且从应用程序代码中隐藏所有类型的注入。