首页/开发/代码质量与评审速查/遗留代码:接缝与包装(Legacy Seams)
重构手法62 条

遗留代码:接缝与包装(Legacy Seams)

给无测试的遗留代码找接缝:在接缝处引入包装层(Wrapper、Adapter)与特征测试(characterization test),先锁定行为再逐步重构;不能全量重写时,测试是关键投资。

接缝与包装是什么

给没有测试的遗留代码找接缝:接缝指可以在不改动内部实现的情况下替换行为的位置。在接缝处引入包装层(包装器、适配器)与特征测试,先锁定现有行为,再逐步重构。当全量重写不现实时,这套回归保护是这里最值得投入的部分。

基本信息

接缝可在不改动内部实现的前提下替换行为的位置
引入手段提取接口、注入依赖、包装外部调用
测试形式特征测试,记录现状行为(含看起来奇怪的行为)
前提能选定稳定入口并构造输入
目标让后续改动有回归保护

典型使用场景

  • 接手没有测试的老系统,先建立一层回归保护
  • 替换第三方库前,用适配器隔离调用点
  • 把难以测试的静态调用包装成可注入的依赖
  • 渐进式重写:新旧实现并存,用接缝切换流量
  • 为难以构造的场景(时间、外部接口)提供可替换入口

特征测试要点

特征测试要点
1. 选定入口,记录真实输入输出对(含边界与异常)
2. 断言当前看起来奇怪但确实存在的行为
3. 重构期间测试一旦偏离即红灯,据此定位影响
4. 发现的缺陷单独记录并排期,不混进重构提交

接缝的引入方式

方式适用注意
提取接口多处调用同一实现接口只保留真实需要的操作
注入依赖内部直接构造或静态调用引入后可测试替换
包装外部调用第三方库、系统时间包装层要薄,别再加难测逻辑
特征测试锁定的是现状而不是期望:重构期间发现明显缺陷时单独记录,不要顺手修正,否则重构与修缺陷混在一起,出问题无法归因。

接缝选择的判断

  • 优先选调用频繁、影响面大的位置,投入产出比更高
  • 选行为相对稳定、输入输出可构造的入口
  • 避免一次引入过多接缝,配套清理计划才不会越积越多
  • 接缝要薄:只做转接,不要在里面再加一层业务逻辑

易错点

  • 特征测试直接断言期望值:现状与期望不符时测试永远红,最后只能关掉
  • 包装层无限叠加:接缝数量要控制,并配套清理与迁移计划
  • 接缝藏在内部实现里:改动仍要碰到难测代码,保护并未真正建立
  • 用大范围重写替代接缝:一次性改写没人能评估风险,回退成本极高

数据来源与参考

  • 《重构》第 2 版 · 第 24 章(重构与既有代码)与 Michael Feathers《修改代码的艺术》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌