← Back · Tenet

WET Principle

DATE=2026-07-24

WET 常被写作 Write Everything Twice(亦有 Write Every Time、We Enjoy Typing 等说法),用以对冲被滥用的 DRY(Don't Repeat Yourself)。其核心不是鼓励复制粘贴,而是:

在尚未看清真正共性之前,允许重复;过早抽象的成本,往往高于暂时重复的成本。

DRY 被误用时的后果

DRY 的本意是「知识的单一表述」,不是「表面上相似的代码必须合并」。常见误用包括:

  • 两处业务规则碰巧相似,被抽成「通用工具」,随后各自演化,参数膨胀为配置地狱。
  • 为消除少量重复而引入跨模块依赖,编译、部署与认知成本一并上升。
  • 「共享库」成为多团队变更瓶颈——一处修改触发多处故障。

表面重复消失了,但错误耦合往往比重复更难拆除。DRY 约束的是知识,不是字符相似度。

WET 的实践含义

常用启发式(与 Rule of Three 相近):

  1. 第一次按需求如实实现。
  2. 第二次可以复制并局部调整——此时观察差异。
  3. 第三次若仍高度同构,再抽象,并将差异建模为明确的参数、策略或扩展点。

「Write Everything Twice」强调第二步的合理性:先积累证据,再提炼稳定共性。

仍应坚持 DRY 的场景

  • 同一业务不变量出现在多处(计费规则、权限判定、状态机)——重复会导致语义漂移,需要单一来源。
  • 安全与合规逻辑、协议编解码、核心领域模型。
  • 变更历史表明两处总是同步修改。

WET 反对的是投机性共享,而非合理共享。

评审时的判断标准

面对「抽取公共方法 / 共享库」时,可检查:两处的变化频率与业务含义是否一致。若答案含糊,保留重复并注明「有意未抽取」通常更稳妥。重复是可见债务;错误抽象是带利息的债务。