何时违反单一责任原则
When to violate the single responsibility principle?
如何决定何时以及如何违反单一责任原则?
例如,假设我有一个具有以下接口的网络相机(为了简单起见,接口保持愚蠢和"错误"):
class Camera
{
string user();
void set_user(string user);
string password();
void set_password(string password);
string url();
void set_url(string url);
image take_snapshot();
bool reboot();
}
这看起来很自然,但Camera类似乎有3个职责:存储元数据、拍摄快照、重新启动。按照SRP,你可以这样写:
class Camera
{
string user();
void set_user(string user);
string password();
void set_password(string password);
string url();
void set_url(string url);
}
image take_snapshot(camera c);
bool reboot_camera(camera c);
这里的东西在响应性方面被巧妙地分开了,但现在它看起来很像C,有着愚蠢的结构和函数。。。这就引出了我们为什么首先需要OOP的问题。
您如何在便利性和SRP之间取得平衡?
[编辑]
@stjin的想法被@John Zwinck 展示为一个答案
我会这样写你的例子:
class Session
{
public:
Session(string url, string user, string password);
};
class Camera
{
public:
Camera(Session);
image take_snapshot();
bool reboot();
};
这里的主要思想是将身份验证和会话/端点定义(也许还有连接)与相机控件分离。Camera类现在更像是一台真正的相机:它有一个电源按钮和一个快门按钮。相机的虚拟化本身就在其他地方。这也使得如果有人想为不同的相机等进行USB会话,该怎么办变得更加明显。
这里的次要思想是,对象从一开始就以有效状态创建。例如,在没有密码的情况下,无法配置相机,因此在没有凭据的情况下调用take_snapshot()是不可能的。当然,凭据可能无效,但可以通过某个构造函数中可能调用的方法进行检查。
顺便说一句,自由函数没有错。OOP被高估了,我们都知道,如果免费函数在你的用例中有效,你不应该觉得有任何道歉的必要。愚蠢的结构可能比毫无意义的getter和setter更好——尤其是如果你没有构建一个具有ABI兼容性要求的可重用库。
相关文章:
- С++ wxWidgets:代码架构,设计原则和模式
- 我需要如何更改我的程序以使用打开/关闭原则?
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- Visual Studio 2017扩展选项卡中的C++核心指导原则检查器丢失
- 是否有一种设计模式或面向对象的基本原则来处理这种共享资源的情况?
- 分层状态机涉及哪些原则,以及如何实现基本模型?
- 如何应用注册表模式使"select class depend on input"遵守开放封闭原则?
- 不兼容的操作原则到三元op
- 代码在Visual C ++中无法按预期工作(来自bjarne stroustrup编程和原则书籍2n版本的示例)
- 在机器学习中使用责任链模式
- 用坚实的原则用 arduino 写作
- 保证复制责任的行为是否取决于用户定义的复制构造函数的存在
- 提升月份的行为的原则是什么?
- C++中的依赖反转(来自 S.O.L.I.D 原则)
- Objective-C 块文字语法原则
- 我是否应该努力负责单一责任或最大程度地减少成员变量的数量
- BST 与 C++ 年的 OOP 原则
- 何时违反单一责任原则
- 单一责任原则和集合
- 智能指针的依赖关系注入是否违反单一责任原则