Design patterns 单一责任原则的范围是什么?它如何与DRY一起工作?

Design patterns 单一责任原则的范围是什么?它如何与DRY一起工作?,design-patterns,domain-driven-design,solid-principles,object-oriented-analysis,single-responsibility-principle,Design Patterns,Domain Driven Design,Solid Principles,Object Oriented Analysis,Single Responsibility Principle,我需要帮助澄清我对单一责任原则(SRP)的(错误)理解 在我参与的许多项目中,我的同事认为SRP意味着一个类应该实现非常有限的功能,例如,计算对象集合上的一些总数。这导致类具有一个公共方法(一个职责),例如,CalculateTotals(…)。我不是DDD专家,但据我所见,这导致了领域模型、DTO和无穷无尽的微服务的匮乏 采用这种方法并将DRY添加到混合中,可以在应用程序的不同部分重用这些类 我倾向于在更高的层次上思考SRP,即需求层次。例如,报告需要计算总计,而税务相关计算需要计算总计。在这

我需要帮助澄清我对单一责任原则(SRP)的(错误)理解

在我参与的许多项目中,我的同事认为SRP意味着一个类应该实现非常有限的功能,例如,计算对象集合上的一些总数。这导致类具有一个公共方法(一个职责),例如,
CalculateTotals(…)
。我不是DDD专家,但据我所见,这导致了领域模型、DTO和无穷无尽的微服务的匮乏

采用这种方法并将DRY添加到混合中,可以在应用程序的不同部分重用这些类

我倾向于在更高的层次上思考SRP,即需求层次。例如,报告需要计算总计,而税务相关计算需要计算总计。在这种情况下使用DRY可能会导致意外的错误。当由于报告要求的更改而需要更改总计计算逻辑时,如果我们应用了DRY并重用了该类,我们将中断税务计算

考虑到变更的原因应该仅仅是需求变更的结果(我不认为重新分解适用于这里),DRY原则是否应该仅在一个用例中确定范围

如果上述陈述是正确的,是否意味着我们不必将税收计算划分为单独的类别?好吧,我们可以这样做来简化代码,但出于SRP的原因,我们不会这样做吗


我的想法错了吗?

单一责任原则到底说了什么?

因此(至少就SRP而言),如果一个类只可能因为一个原因而更改,那么该类拥有多个方法是可以的。与所有这些原则一样,决定SRP是否适用(相当于决定什么构成一个类改变的单独原因)是一个品味和判断的问题

例如,在我刚刚链接到的SRP的原始描述中,我发现将SRP应用于玩具保龄球游戏是免费的——如果保龄球规则改变,分离的类都会改变。另一方面,将几何计算与呈现UI分离对任何人都有意义

我不知道你的代码库,但我觉得每个方法都有一个类是错误的

SRP与干燥有什么关系?

与SRP相反的是,如果两个等级因相同的原因发生变化(如在保龄球比赛中),那么它们可能应该是一个等级。这本身与DRY根本没有关系(这是关于责任的扩散,而不是代码的复制),但是:如果有人在编写或提取第二个类时忘记了DRY,那么当您更改两个类时,您可能会注意到(或者更糟糕的是,当您忘记更改一个类并在生产中发现时)并提醒自己为什么干燥很重要

我是否应该对我单独负责的类执行重复数据消除(“干燥”)操作?

对。相同代码的副本会导致错误。不要无理;如果提取某些重复代码使您的程序更难理解并增加了代码行数,那么您肯定做得太多了。但确实要提取重要的重复,您只需测试一次,并在它发生变化时更改一次

但是,请始终明确提取的方法与需求的关系。如果您需要以相同的方式对某些值求和以进行报告和税务计算,不要调用方法
totalForReporting
,也不要调用它
total
,然后将它放在您的
ReportingService
上,然后从您的
TaxService
调用它——想要更改报告而不是税务计算的人不会考虑检查该方法是否在其名称不会引导您使用的上下文中使用期待。相反,将该方法称为一般方法,如
transactionTotal
,或者仅将其称为
total
,并将其放在您的
GeneralLedgerService
上,它将完全(嗯)清楚其角色是什么以及何时应该更改


着眼于需求的重复数据消除将增强您的域模型,因为您将始终小心地将代码与适当的域概念相关联,无论是模型还是服务或其他概念。

如果您添加示例类,这将有所帮助。不是代码而是公共签名。现在它看起来像什么?您想如何修改它?如果您添加更多有关实际税务计算的信息,也会有所帮助。Jgauffin,这更像是一个一般性问题,而不是一个具体案例。当我看到一个需求的细节,然后以SRP的名义花那么多时间在无休止的抽象和间接中寻找实现时,我会感到沮丧。大多数情况下,它是在一个小类涵盖的测试。这一切都清晰易懂,但却让人感觉断章取义。。。是SRP发展到了不健康的极端,还是只有我有中年危机;)那么,不要在问题中给出具体的例子。