我认为 SRP 的目的是识别一个类做得太多的情况,更好的设计是拥有多个类。一个经典的例子:一个 ReportProducer 类,它做一些工作来组装数据和一些工作来格式化输出,可能应该有两个类:一个用于收集,一个用于格式化。这种方法的好处之一是灵活性:我们可以使用单个收集类和多个不同的格式化程序类。
现在您的示例似乎很合理,您有一个连贯的类,所有方法都是相关的,该类的用户知道这是要用于订单的类。这对我来说似乎是一个单一的责任。
改变的原因是什么?在报告示例中,我们有两种完全不同的更改:可能是数据来自何处的更改,或者可能是所需的格式更改。在您的示例中,有人可能会争辩说还有多种可能的原因:订单的“形状”可能会改变,所需的界面可能会改变(例如,添加 queryCancelledOrders() 方法)您作为门面的后端可能会改变。但是,我不认为这些迹象表明您违反了 SRP:它们都与呈现用于操作订单的界面的任务有关。
如果我们完全从字面上理解“改变的单一理由”,那么我不相信我们可以编写任何课程。我们总是有接口和实现,通常还有一些依赖类。其中任何一个都可能改变,所以我们总是有至少两个甚至三个改变的理由。
而是想想“这个类的职责是什么?” 不使用“AND”之类的词,能不能用句子来表达。不好:收集数据并格式化报告。