好的,实现IComparable和其他接口(如IDisposable)在单个类上是否违反了SRP原则。 SRP规定每个类应该实现单一职责,方法应高度相互关联以实现内聚的类。 难道比较不是另一个职责吗? 希望能够提供一些澄清。
如果我是你,我会尽量遵守SRP,但不要过分追求。那么现在,你该怎么办呢?要么实现IComparable并将比较完全封装在对象中,要么使用单独的比较器并在其中实现比较逻辑。 对于比较而言,就SRP而言,如果比较相当基本且不应受到更改的影响,我会实现IComparable并完成它。如果您可以合理地预见未来的一些变化,或者比较取决于用例,则我会选择比较器路线。最终目标是开发封闭的组件,并通过组合使它们互相配合。因此,如果比较几乎不会改变,那么组件可以关闭,您就不必再关心它了。您还可以在代码中注释使用IComparable,并且如果未来发生了一些变化,则切换到使用比较器进行组合,因为被认为不会发生的变化确实发生了。
我认为IComparable和IDisposable的实现根本不是责任,因此不会违反SRP。在SRP的背景下,责任是对您系统的互动者(即用户、角色或外部系统)的一种责任。如果您的系统有业务需求文档,则所有责任都应至少隐含在功能或非功能需求中。如果没有,请问自己哪个业务所有者会要求您更改对象如何处理自身。在我学习SRC后参与的第一个项目上,我们将其解释为“每个类一个公共方法”,并将其视为硬性规则应用。虽然这使得保持“合规”变得容易,但最终导致了比必要复杂得多的代码。如果您的IComparable/IDisposable实现需要更改,则该更改将受到业务部分(原因相同且同时需要更改)的驱动。