Remove Dead Code 是什么
无人调用、不可达、被开关永久关闭的代码应当删除:版本库本身就是存档,不需要靠注释和 if (false) 保留。死代码的危害不只是占地方——它会被读代码的人当成活代码理解,被复制到新地方,还会让覆盖率与复杂度统计失真。删之前用引用检索与运行统计确认,删之后靠测试回归。
基本信息
| 类型 | 不可达分支、未被引用函数、废弃开关、过期注释掉的代码 |
|---|---|
| 确认 | 静态检索 + 覆盖率报告 + 线上调用日志 |
| 恢复 | 需要时从版本历史找回,而不是靠留在代码里 |
| 前置 | 删除必须在有测试或可观测手段的情况下进行 |
常见死代码形态
- 功能开关已全量打开或全量关闭,但两个分支都还留着
- 被注释掉的旧实现,注释写着「暂时保留」已过数月
- 只被测试引用的方法(测试也早已被跳过)
- catch 后什么都不做,或永远为真的条件分支
- 只在旧版本协议下才会走到的兼容代码块
- 构建脚本里指向已删除模块的任务
确认与清理思路
确认与清理思路
git grep -n "oldFeatureFlag" # 全仓检索引用点
git log -S "oldFeatureFlag" --oneline # 查它何时被引入、是否仍在变
# 结合覆盖率报告确认无执行记录
# 检查配置与反射:字符串拼出的方法名静态检索不到
# 删除后运行测试与冒烟,确认无回归确认手段对照
| 手段 | 能证明什么 | 局限 |
|---|---|---|
| 静态检索 | 无直接引用 | 漏掉反射、配置、外部调用 |
| 覆盖率报告 | 某次运行未执行 | 未覆盖的路径同样可能是活的 |
| 运行时统计 | 一段时间内未调用 | 低频任务可能被误判 |
| 版本历史 | 引入背景与是否仍在变 | 不直接说明是否可删 |
删代码前先确认没有反射、配置驱动的调用:字符串拼出的方法名静态检索不到,删掉之后往往要等线上报错才发现。对这类调用点,先加日志观察一段时间再删更稳。
只注释不删除是一种隐性债务:注释块会随代码演进一起漂移,几个月后没人敢确认它是否还可恢复。真要留档,写在提交信息或版本历史里更可靠。