WET 常被写作 Write Everything Twice(亦有 Write Every Time、We Enjoy Typing 等说法),用以对冲被滥用的 DRY(Don't Repeat Yourself)。其核心不是鼓励复制粘贴,而是:
在尚未看清真正共性之前,允许重复;过早抽象的成本,往往高于暂时重复的成本。
DRY 被误用时的后果
DRY 的本意是「知识的单一表述」,不是「表面上相似的代码必须合并」。常见误用包括:
- 两处业务规则碰巧相似,被抽成「通用工具」,随后各自演化,参数膨胀为配置地狱。
- 为消除少量重复而引入跨模块依赖,编译、部署与认知成本一并上升。
- 「共享库」成为多团队变更瓶颈——一处修改触发多处故障。
表面重复消失了,但错误耦合往往比重复更难拆除。DRY 约束的是知识,不是字符相似度。
WET 的实践含义
常用启发式(与 Rule of Three 相近):
- 第一次按需求如实实现。
- 第二次可以复制并局部调整——此时观察差异。
- 第三次若仍高度同构,再抽象,并将差异建模为明确的参数、策略或扩展点。
「Write Everything Twice」强调第二步的合理性:先积累证据,再提炼稳定共性。
仍应坚持 DRY 的场景
- 同一业务不变量出现在多处(计费规则、权限判定、状态机)——重复会导致语义漂移,需要单一来源。
- 安全与合规逻辑、协议编解码、核心领域模型。
- 变更历史表明两处总是同步修改。
WET 反对的是投机性共享,而非合理共享。
评审时的判断标准
面对「抽取公共方法 / 共享库」时,可检查:两处的变化频率与业务含义是否一致。若答案含糊,保留重复并注明「有意未抽取」通常更稳妥。重复是可见债务;错误抽象是带利息的债务。