簡體   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