首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据Robert C. Martin的说法,代码复制和SRT

根据Robert C. Martin的说法,代码复制和SRT
EN

Stack Overflow用户
提问于 2019-07-06 17:18:19
回答 1查看 102关注 0票数 1

我正在读罗伯特·C·马丁的“清洁建筑”一书。在单一责任原则的示例中,他演示了一个具有三个公共方法的Employee接口:calculatePayreportHourssaveEmployee

代码语言:javascript
复制
class Employee {
public:
  float calculatePay();
  float reportHours();
  void saveEmployee();

private:
  float calculateRegularHours();
}

他认为,这三种方法不应该包含在同一个类中,因为它们服务于不同的参与者:首席财务官、首席运营官和首席技术官。然后他描述了后果:如果首席财务官决定改变计算正常工作时间的方法,程序员可能会意外地改变首席运营官的计算算法,因为它们依赖于相同的方法calculateRegularHours。

我的问题是:遵守SRP对我们有什么帮助?即使我们在两个不同的类中实现了calculatePayreportHours,它们仍然依赖于相同的方法calculateRegularHours,所以要么我们实现该方法两次(这将是代码重复),要么我们不得不接受对它的更改将影响这两个参与者的风险。

我没有注意到哪一点?你会如何处理这种特殊的情况?

感谢您的回复!

EN

回答 1

Stack Overflow用户

发布于 2019-07-09 14:31:10

或者我们实现这个方法两次(这将是代码重复)

这看起来像是代码重复,但事实并非如此。事实上,calculatePayreportHours使用的calculateRegularHours实现是相同的,这只是一个意外。

由于calculatePayreportHours服务于不同的参与者,因此它们在不同的时间会因为不同的原因而发生变化。因此,这些参与者中的一个可能会请求另一个参与者不想要的更改。那么当遇到这个请求时,你会怎么做呢?我猜你会把calculateRegularHours逻辑分成两个实现。但也有可能你忘记了这一点,你会在一个与你想要做出的改变毫无关系的地方破坏系统。

Robert C. Martin在this video (39:26 - 43:00)中解释了这一点。

我猜违反SRP的一个更好的例子是将服务于UI的方法放在业务对象中,或者甚至将SQL放在视图中。

无论您做什么,您都应该进行测试,因为测试可以显示您在一个完全不同的领域破坏了系统。如果发生这种情况,您应该重新考虑设计,并记住SRP。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56912740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档