首页/开发/代码质量与评审速查/手法:Remove Dead Code(移除死代码)
重构手法62 条

手法:Remove Dead Code(移除死代码)

无人调用、不可达、被开关永久关闭的代码删除:版本库保留历史,不需要靠注释与 if(false) 存档;删前用引用检索与运行时统计确认,删后靠测试回归。

Remove Dead Code 是什么

无人调用、不可达、被开关永久关闭的代码应当删除:版本库本身就是存档,不需要靠注释和 if (false) 保留。死代码的危害不只是占地方——它会被读代码的人当成活代码理解,被复制到新地方,还会让覆盖率与复杂度统计失真。删之前用引用检索与运行统计确认,删之后靠测试回归。

基本信息

类型不可达分支、未被引用函数、废弃开关、过期注释掉的代码
确认静态检索 + 覆盖率报告 + 线上调用日志
恢复需要时从版本历史找回,而不是靠留在代码里
前置删除必须在有测试或可观测手段的情况下进行

常见死代码形态

  • 功能开关已全量打开或全量关闭,但两个分支都还留着
  • 被注释掉的旧实现,注释写着「暂时保留」已过数月
  • 只被测试引用的方法(测试也早已被跳过)
  • catch 后什么都不做,或永远为真的条件分支
  • 只在旧版本协议下才会走到的兼容代码块
  • 构建脚本里指向已删除模块的任务

确认与清理思路

确认与清理思路
git grep -n "oldFeatureFlag"          # 全仓检索引用点
git log -S "oldFeatureFlag" --oneline  # 查它何时被引入、是否仍在变

# 结合覆盖率报告确认无执行记录
# 检查配置与反射:字符串拼出的方法名静态检索不到
# 删除后运行测试与冒烟,确认无回归

确认手段对照

手段能证明什么局限
静态检索无直接引用漏掉反射、配置、外部调用
覆盖率报告某次运行未执行未覆盖的路径同样可能是活的
运行时统计一段时间内未调用低频任务可能被误判
版本历史引入背景与是否仍在变不直接说明是否可删
删代码前先确认没有反射、配置驱动的调用:字符串拼出的方法名静态检索不到,删掉之后往往要等线上报错才发现。对这类调用点,先加日志观察一段时间再删更稳。
只注释不删除是一种隐性债务:注释块会随代码演进一起漂移,几个月后没人敢确认它是否还可恢复。真要留档,写在提交信息或版本历史里更可靠。

易错点

  • 反射或配置调用未识别:删除后线上才报错,故障定位成本极高
  • 只注释不删除:注释代码长期堆积,无人清理也无人敢用
  • 删除与重构混在同一个大改动里:出问题时无法判断是哪一类改动引起
  • 只删函数不删对应测试与配置:残留的引用让下一次删除更难判断

数据来源与参考

  • 《重构》第 2 版 · 第 8 章(Remove Dead Code)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌