知识卡片
ISP在架构层面:依赖不需要的东西在任何层次都有害
内容
[[ISP的源码级成因接口隔离消除不必要的重新编译部署]]揭示的规律不止停留在源代码层面——任何层次的软件设计,只要依赖了自己不需要的东西,都会带来意料之外的麻烦。一个架构级的例子:架构师给系统S引入了框架F,而框架F的作者又把F捆绑在特定数据库D上,于是形成了S依赖F、F依赖D的链条。如果数据库D里包含一些F根本用不到的功能,那这些功能对S而言自然也是不需要的;一旦D中这些”无关”功能被修改,会触发F需要重新部署,进而拖累S也要跟着重新部署——更糟的是,D中一个与S、F功能完全无关的模块里的bug,也可能间接导致F和S运行出错。这种传递性依赖的破坏力和源码层面User1因为OPS类被改动而被迫重新编译部署是同一种病症,只是发生在架构这个更高的层次。这也是为什么ISP不能被简单归结为”选对动态类型语言就能规避”的语言选择问题:无论源码依赖是否被编译器强制检查,一旦架构设计层面出现了”依赖一个自己用不到的更大整体”的结构,这个整体内部任何看似无关的变动或缺陷,都有可能沿着依赖链条传导到本不该受影响的系统。本章预告了这条思路会在第13章”组件聚合”讨论共同复用原则时进一步展开。
参考来源
- 位置:《架构整洁之道》第10章《ISP:接口隔离原则》"ISP与软件架构""本章小结"(源文件:_epub-src/text/part0012_split_004.html)
- 结论依据:原文用系统S依赖框架F、F捆绑数据库D的例子,说明D中F不需要的功能同样也是S不需要的,D的修改或bug都可能沿依赖链拖累F和S,并明确总结"任何层次的软件设计如果依赖了它并不需要的东西,就会带来意料之外的麻烦",直接支撑本卡片结论。
- 原始内容:如果D中包含了F不需要的功能,那么这些功能同样也会是S不需要的……D中一个无关功能的错误也可能会导致F和S运行出错……任何层次的软件设计如果依赖了它并不需要的东西,就会带来意料之外的麻烦。