繁体   English   中英

智能指针的依赖注入是否违反单一职责原则?

[英]Does dependency injection by smart pointers violate Single Responsibility Principle?

我担心的是,当使用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 包含在某个私有对象中 - 从而完全防止它意外访问“读取”加法器变量,例如:

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

private:
   AdderProxy adder;

或者,你可以有一些DI图书馆,像这样的一个方向-有各类注射剂在应用程序代码隐藏的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM