包的细化程度有时与系统的稳定程度呈反比
在结构设计中,我们尽可能将类的 SRP 做到极致,但我认为不能将类的 SRP 应用在包的设计中,因为对包的不必要细化有的时候将增加系统的不稳定性。在这里,我将以一个的简单而愚蠢的解决方案来阐述。
问题:是否应该编写一个可定制的容器库,避免在其他使用容器的应用程序中因为那些没有被使用的容器的更新而重新发布?
解决方案:设计一个如下的包图:
现在我们得知包的不稳定性 I :
由条件
I(Container)<I(Sequance) and
I(Container)<I(Association) and
I(Sequance)<I(Vector) and
I(Sequance)<I(List) and
I(Association)<I(Map) and
I(Association)<I(Set)
得知该设计满足 SDP 。现在包 Vector 、 List 、 Map 、 Set 的更新不会导致整个容器库的发布,因而避免了单独的容器组件的更新而更新整个容器库。
证明:将容器库包分解后虽然减小了的发布粒度,但不稳定性将随着发布粒度的减小而增大。
举例:我们仅使用 Vector 容器构建应用程序,设计一个如下的包图:
再次计算包的不稳定性 I :
由条件 I(Vector)<I(Sequance) 得知该设计违反了 SDP 。
结论:包的细化应该实施在特定问题领域而非问题领域之外的所谓组件包中。由于容器库与该应用程序并非同一的问题领域,对容器库细化后将造成其不可通用性,遵循 CCP 将包有效地分开,将焦点直接投入到单一问题中会避免很多不必要的矛盾。若在 SRP 角度视之,可将类的 SRP 提升为更为宏观的问题 SRP 。将每一个问题领域的包闭合,减少重用时的难度。
Huahung Wong
2011-02-04