智能指针的依赖注入是否违反单一职责原则?
Does dependency injection by smart pointers violate Single Responsibility Principle?
我担心的是,在使用 shared_ptr
或 unique_ptr
时,我坚持使用一种所有权模型 - 注入的对象要么是共享的,要么是我自己的。我认为这是次要的 class 责任 - 关心注入对象的生命周期。
那么,它是否违反了 SRP - 假设 class 已经承担了一些责任。
一些简单的例子:
class Calculator {
public:
Calculator(std::unique_ptr<Adder> adder) : adder(adder) {}
void add();
private:
std::unique_ptr<Adder> adder;
};
当设计发生变化时——所以我会有很多不同的计算器——然后我需要将 unique_ptr
更改为 shared_ptr
。所以即使 Calculator
主要责任(计算)没有改变 - 我需要改变 class.
对注入的对象使用简单的引用不会更好 - 只是将注入对象生命周期的责任留给其他一些 classes?
不,我们在对象中保存成员变量的方式是实现细节,与Single Responsibility Principle
等设计原则没有任何关系
为了说明这一点 - 您可以通过一些私有方法封装对成员的访问 - 当您从 unique_ptr
更改为 shared_ptr
或相反时,这可以防止 class 实现中的更改.
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 库,像这样 one - 并在应用程序代码中隐藏所有类型的注入。
我担心的是,在使用 shared_ptr
或 unique_ptr
时,我坚持使用一种所有权模型 - 注入的对象要么是共享的,要么是我自己的。我认为这是次要的 class 责任 - 关心注入对象的生命周期。
那么,它是否违反了 SRP - 假设 class 已经承担了一些责任。
一些简单的例子:
class Calculator {
public:
Calculator(std::unique_ptr<Adder> adder) : adder(adder) {}
void add();
private:
std::unique_ptr<Adder> adder;
};
当设计发生变化时——所以我会有很多不同的计算器——然后我需要将 unique_ptr
更改为 shared_ptr
。所以即使 Calculator
主要责任(计算)没有改变 - 我需要改变 class.
对注入的对象使用简单的引用不会更好 - 只是将注入对象生命周期的责任留给其他一些 classes?
不,我们在对象中保存成员变量的方式是实现细节,与Single Responsibility Principle
等设计原则没有任何关系为了说明这一点 - 您可以通过一些私有方法封装对成员的访问 - 当您从 unique_ptr
更改为 shared_ptr
或相反时,这可以防止 class 实现中的更改.
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 库,像这样 one - 并在应用程序代码中隐藏所有类型的注入。