在刷新SRP时,我在OOD原则上通过this阅读了Uncle Bob's page文件。我发现以下段落令人费解,并且与文档的其余部分有些不一致:
“另一方面,如果应用程序没有以导致两个职责在不同时间发生变化的方式发生变化,那么就没有必要将它们分开。实际上,将它们分开会闻到无气味复杂性。这里有一个推论。如果实际发生了变化,变化轴只是变化的轴。如果没有症状,应用SRP或任何其他原则是不明智的。“
虽然我理解许多软件开发问题的答案是“依赖于”SRP这样的原则似乎几乎普遍有益,并且理所当然地实施。 SRP本身为代码提供了对未来需求变化的高度适应性。是不是要将责任从一开始就分开,以避免以后在高度耦合的代码和级联更改中挣扎?
我真的很感激对此的一些澄清,以确保我对这一核心原则的理解是正确的。提前谢谢!
答案 0 :(得分:0)
根据我的谦虚理解,在此处提供的Modem
示例中,调制解调器的职责可能有可能(连接和数据交换)将改变为一个。
这里有两种可能性:
协议发生变化时,可能只有连接部分发生变化,或者只有数据交换部分发生变化。在这种情况下,您应该有两个接口,因为数据中协议的更改并不意味着连接中协议的更改。
协议发生变化时,它将始终更改连接部分和数据交换部分。在这种情况下,您不需要两个接口,因为每次您必须重写连接部分时,您确信数据交换也会发生变化。在这种情况下,您有两个责任放在相同的更改轴上(这是调制解调器处理的协议),因此您可以将它们保留在单个界面中。
答案 1 :(得分:0)
这句话的关键是"不会改变导致两个责任在不同时间发生变化的方式"。我们为了争论而说,您有一个 PaymentLogger 和一个付款类。每当您创建新的 PaymentType (CreditCard,Cash,Paypal等)时,您需要更新 PaymentLogger 以记录特定于付款的操作。您可以让付款类有一个名为 Log 的方法,而不是拆分 PaymentLogger 类,该方法可以执行任何特定于自身的操作。
在这种情况下,记录操作的行为可能会构建到类本身,因为创建新的付款还需要创建新的 PaymentLogger 。它应该一直是付款的一部分。