智能指针的依赖关系注入是否违反单一责任原则
Does dependency injection by smart pointers violate Single Responsibility Principle?
我担心的是,当使用shared_ptr
或unique_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库,比如这个 - 并且从应用程序代码中隐藏所有类型的注入。
相关文章:
- CRTP 单一实例不完整类型或非文本类型
- 避免从单一元素向量转换为基元类型
- 为什么这不违反单一定义规则?
- make_unique 不会为创建单一实例进行编译
- C++ 中的基本单一实例对象
- 在声明或实现中延迟初始化C++单一实例
- 了解 DCL60-CPP 中的不合规代码示例:遵守单一定义规则
- 使用单一实例类作为派生类时,如何访问基类中的函数
- 具有单个生产者单一使用者的无锁循环缓冲区
- 单一实例对象是否通过线程安全返回shared_ptr
- std::system 实例化单一实例对象时的异常
- 超出返回引用的单一实例生存期
- C++复杂类型的单一方法的模板专用化
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 使用unique_ptr的单一实例对象
- 我是否应该努力负责单一责任或最大程度地减少成员变量的数量
- 何时违反单一责任原则
- 继承深度、单一责任或 DRY
- 单一责任原则和集合
- 智能指针的依赖关系注入是否违反单一责任原则