知识卡片

ADP无依赖环原则:从"一觉醒来综合征"到组件化发布

结构图卡

内容

多个程序员同时修改同一份代码,会造成”一觉醒来综合征”——昨天调好的代码今天上班却莫名不能用了,因为有人在你走后改动了你依赖的组件。历史上有过两种应对方案:每周构建(前四天各自在私有库上开发、周五统一集成)随项目变大逐渐失效——集成工作量随规模增长,加班从周六蔓延到周四,构建间隔和项目质量之间陷入两难。真正的解法是无依赖环原则(ADP):把研发项目划分成一组可独立发布的组件,各自由单人或小组负责,通过打版本号、发布到共享目录的方式对外开放,依赖方可以自主决定是否升级、也可以继续用旧版本——这样任何一个组件的变更都不会立刻波及其他团队,集成工作变成小型渐进的过程。但这套流程能成立的前提是组件依赖结构中绝对不能出现循环依赖,整个依赖关系图必须是有向无环图(DAG):从图中任意节点出发,沿依赖边都不能走回起点。这个结构带来的实际好处很直接:某组件发布新版本时,只需沿依赖关系反向追溯就能判断哪些组件会受影响(如Presenters更新会影响View和Main,但Main更新不会影响任何人,因为没有组件依赖它);测试某组件时只需要和它依赖的组件一起构建,其他组件无需改动;整个系统的发布也可以按依赖关系从下至上清晰有序地推进(先Entities,再Database和Interactors,再Presenters/View/Controllers/Authorizer,最后Main)。

结构图

flowchart TD
    Entities --> Database
    Entities --> Interactors
    Database --> Presenters
    Interactors --> Presenters
    Presenters --> View
    Presenters --> Controllers
    Interactors --> Authorizer
    View --> Main
    Controllers --> Main
    Authorizer --> Main

参考来源

- 位置:《架构整洁之道》第14章《组件耦合》"无依赖环原则""每周构建""消除循环依赖"(源文件:_epub-src/text/part0013_split_003.html) - 结论依据:原文描述"一觉醒来综合征"的成因、每周构建方案随项目增长而失效的过程,说明基于版本发布的组件化方案如何解决这一问题,并明确要求组件依赖结构必须是有向无环图,否则问题依然存在,直接支撑本卡片的结构图与解释。 - 原始内容:这种综合征的主要病因是多个程序员同时修改了同一个源代码文件……组件依赖关系图中不应该出现环……不管我们从该图中的哪个节点开始,都不能沿着这些代表了依赖关系的边最终走回到起始点……我们称这种结构为有向无环图。