我正在读罗伯特·C·马丁的“清洁建筑”一书。在单一责任原则的示例中,他演示了一个具有三个公共方法的Employee接口:calculatePay、reportHours和saveEmployee
class Employee {
public:
float calculatePay();
float reportHours();
void saveEmployee();
private:
float calculateRegularHours();
}他认为,这三种方法不应该包含在同一个类中,因为它们服务于不同的参与者:首席财务官、首席运营官和首席技术官。然后他描述了后果:如果首席财务官决定改变计算正常工作时间的方法,程序员可能会意外地改变首席运营官的计算算法,因为它们依赖于相同的方法calculateRegularHours。
我的问题是:遵守SRP对我们有什么帮助?即使我们在两个不同的类中实现了calculatePay和reportHours,它们仍然依赖于相同的方法calculateRegularHours,所以要么我们实现该方法两次(这将是代码重复),要么我们不得不接受对它的更改将影响这两个参与者的风险。
我没有注意到哪一点?你会如何处理这种特殊的情况?
感谢您的回复!
发布于 2019-07-09 14:31:10
或者我们实现这个方法两次(这将是代码重复)
这看起来像是代码重复,但事实并非如此。事实上,calculatePay和reportHours使用的calculateRegularHours实现是相同的,这只是一个意外。
由于calculatePay和reportHours服务于不同的参与者,因此它们在不同的时间会因为不同的原因而发生变化。因此,这些参与者中的一个可能会请求另一个参与者不想要的更改。那么当遇到这个请求时,你会怎么做呢?我猜你会把calculateRegularHours逻辑分成两个实现。但也有可能你忘记了这一点,你会在一个与你想要做出的改变毫无关系的地方破坏系统。
Robert C. Martin在this video (39:26 - 43:00)中解释了这一点。
我猜违反SRP的一个更好的例子是将服务于UI的方法放在业务对象中,或者甚至将SQL放在视图中。
无论您做什么,您都应该进行测试,因为测试可以显示您在一个完全不同的领域破坏了系统。如果发生这种情况,您应该重新考虑设计,并记住SRP。
https://stackoverflow.com/questions/56912740
复制相似问题