SOLID , SRP , I可比

SOLID , SRP , IComparable

好的,在单个 class 上实现 IComparable 和其他接口(如 IDisposable)违反了 SRP原则 .

SRP 声明每个 class 都应该执行一个单一的责任,方法应该高度互连以实现 凝聚力 classes .

比较不就是一种责任吗?

一些澄清将不胜感激。

如果我是你,我会尝试遵守 SRP,但不会严格遵守,因为这种努力最终会适得其反。所以现在说了这么多,你该怎么办?您要么实现 IComparable 并将比较完全封装在对象中,要么拥有一个单独的比较器并在其中实现比较逻辑。现在进行比较,就 SRP 而言,如果比较是相当基本的并且不应进行更改,我将实施 IComparable 并完成它。如果您可以合理地预见未来的一些变化,或者如果比较依赖于用例,那么我会选择比较器路线。最终目的是开发封闭组件,通过组合让它们相互协作,这样如果比较改变的机会不大,就可以关闭组件,你就不会再听到它了。您还可以在代码中注释 IComparable 的使用,如果将来发生某些更改,请切换为使用比较器进行组合,因为据说不会发生的更改确实发生了。

我认为 IComparable 和 IDisposable 的实现根本 不是 责任,因此不会违反 SRP。

在 SRP 的上下文中,责任是针对系统的交互者(即用户、角色或外部系统)。如果您的系统有业务需求文档,则所有责任至少应在功能或非功能需求中推断出来。如果不是,请问问自己哪个企业主会要求您更改对象的自身配置方式。

在了解 SRC 后我从事的第一个项目中,我们将其解释为 "one public method per class" 并将其作为硬性规则应用。虽然这使得留在 "compliance" 中变得容易,但我们最终得到的代码比需要的复杂得多。

如果您的 IComparable/IDisposable 实施需要更改,该更改将由您的 class 的功能(业务)部分驱动,也需要更改(同时针对相同的 原因).