本节摘要:一致性要求整个代码库对同类问题采用同类解法,读起来像出自一人之手。本节定义一致性的六个层面(格式、命名、结构、逻辑、注释、接口),论证"统一的普通方案胜过各自精彩的最优方案",给出规范文档、自动化工具、代码评审三件套的维护机制,并讨论允许合理偏离的例外管理。
阅读完本节,你应当能够:
一个前端项目里,处理异步操作竟有三种写法并存:老代码用回调函数,中期代码用 Promise 链式调用,新代码用同步风格的等待语法。三种写法都对,各自在写成的年代也都是最佳实践——问题在于并存。新人接手时要在同一个文件里切换三种思维模式;出问题时排查者要先识别"这是哪一派的代码"再套用对应的排查套路;最伤的是想统一时发现三种写法的错误处理路径完全不同,迁移成本高到没人敢立项。
这个案例揭示了不一致的真正代价:它不是审美问题,是认知切换税。心理学上叫"任务切换损耗"——每次在两套模式间切换,注意力都要付出一次额外的进入成本。代码库里每多一种"方言",全团队每天都要交无数次切换税。这也解释了一条反直觉的结论:统一的普通方案胜过各自精彩的最优方案。A 用法在 A 场景比 B 好百分之十,B 用法在 B 场景比 A 好百分之十,但混用让所有场景都付出认知税——净收益为负。一致性的价值不是让每个局部最优,而是让整体最优。
另一个维度是信任与预期。一致的代码库里,读者可以安全地预测:"这个项目处理错误一定是那套模式,找日志一定在那个位置。"预测成立,阅读就快;预测失效(这次居然不一样),就要重新建立心智模型。一致性本质上是在全团队积累"可复用的阅读预期"。
注意六个层面的一致性难度递增:格式与命名可以全自动化,结构与逻辑靠规范加评审,注释与接口的一致性完全依赖团队的自觉与评审把关——这也是为什么一致性需要"三件套"而不是单靠工具。
规范文档定标准:一致性不能靠口口相传,必须文档化且可访问。文档的关键品质是具体可判定——"缩进四格"是规则,"适当缩进"是愿望;每条规则配正反示例,判定标准客观,评审才不打架。
自动化工具打底:格式化工具消灭格式分歧(零人工),Linter 把命名风格、禁用模式变成机器规则(详见第 6 章)。原则是机器能管的不占用人的注意力——评审时间留给逻辑与设计。
代码评审把关:机器管不了的层面(结构、逻辑、注释、接口一致性)靠评审守住。评审清单里放一致性检查项;发现的一致性问题若规范没覆盖,反过来补充规范——评审是规范的雷达。

一致性不等于僵化。确实存在合理偏离:性能关键路径上的特殊写法、第三方约束导致的无奈选择。规范不应该是"绝不",而应该是"偏离必须显式"——写清偏离的原因、适用范围,最好在代码处以注释标记,让读者知道"这是深思熟虑的例外,不是漏网之鱼"。未记录的偏离会被后来者当成"原来可以这样写"的先例,一致性从此漏水。
第 1.2 节讲过破窗效应,这里给出防守操作。第一道防线是增量严守:新代码与被修改的代码必须合规,存量放行(第 1.3 节的渐进策略)。第二道防线是工具全覆盖:CI 检查所有新提交,绕过编辑器直接改文件的人也会被流水线拦下。第三道防线是评审不妥协:对不合规的提交,评审意见是"先合规再评审逻辑",而不是"这次算了下次注意"——"下次注意"就是第一块破窗。
老项目的三种异步并存怎么办?答案不是一次性大迁移(风险与工时都不可行),而是定方向、划增量、给工具:规范定死目标写法;所有新代码用目标写法,修改旧代码时顺手迁移 touched 的部分;提供自动化迁移工具或脚本(多数场景有现成的语法转换工具)降低迁移成本;用 Linter 规则只对目标写法的目录生效,渐进扩大覆盖。收敛以季度为周期度量,不求速胜。
⚠️ 常见坑:把一致性当成拒绝一切改进的挡箭牌。"我们一直这么写"不是理由——如果新方案客观更优(更安全、更简洁),正确路径是全库统一升级而不是拒收。一致性的对象是"当下最优解的全库统一",不是"历史解的永久冻结"。
💡 关键直觉:评估一个方案时,把它乘以"出现的次数"再算成本。一个局部小瑕疵重复两百次就是大问题;一个稍笨但统一的模式,摊到全库反而总成本最低。
| 层面 | 守卫方式 | 收敛难度 |
|---|---|---|
| 格式 | 格式化工具全自动 | 一次性全量格式化 |
| 命名 | Linter 规则加评审 | 中 逐步改 |
| 结构 | 规范加评审 | 高 随重构收敛 |
| 逻辑 | 规范加评审加示例库 | 高 定方向后增量迁移 |
| 注释 | 模板加评审 | 中 |
| 接口 | 设计评审加契约约定 | 最高 涉及兼容性 |
下一节把时间轴拉长:可维护性——一张贯穿软件生命周期的成本账。