知识卡片
CRP共同复用原则的真正重点是"不该放在一起"的类
内容
共同复用原则(CRP)要求不要强迫一个组件的用户依赖他们不需要的东西,具体做法是把经常共同复用的类和模块放在同一个组件中——类很少被单独复用,更常见的是多个类作为某个可复用抽象一起被复用(比如容器类和它的遍历器类紧密相关,一般会被共同复用,理应放进同一个组件)。但CRP真正重要的贡献不是”哪些类该放一起”,而是”哪些类不该放一起”:每当一个组件引用另一个组件,哪怕这个引用只涉及被引用组件中的一个类,也会让引用方彻底依赖上被引用组件——一旦被引用组件发生变更,引用方组件即便不需要任何代码级改动,通常也免不了要重新编译、验证、部署,哪怕它根本不关心那个变更。因此依赖某个组件时最好是真正用到其中的每一个类,理想情况是组件内的所有类不可拆分,不该出现”我只需要依赖它的某几个类”这种情况——否则就要为不必要的组件部署浪费大量时间精力。CRP实际上是[[ISP的源码级成因接口隔离消除不必要的重新编译部署]]的一个更普适版本:ISP说不要依赖带有不需要函数的类,CRP说不要依赖带有不需要类的组件,两者可以合并成同一句话——不要依赖不需要用到的东西。
参考来源
- 位置:《架构整洁之道》第13章《组件聚合》"共同复用原则""与ISP原则的关系"(源文件:_epub-src/text/part0013_split_002.html)
- 结论依据:原文说明组件引用哪怕只涉及被引用组件中一个类也会带来完整依赖、被引用组件变更就会拖累引用方重新编译验证部署,并明确将CRP归纳为ISP的组件级普适版,直接支撑本卡片结论。
- 原始内容:每当一个组件引用了另一个组件时,就等于增加了一条依赖关系……哪怕引用组件根本不关心被引用组件中的变更,也要如此……CRP原则实际上是ISP原则的一个普适版……不要依赖不需要用到的东西。