跳转到内容

移除死代码

移除死代码(Remove Dead Code)删掉不再被调用的函数、永远不会执行的分支和被注释掉的代码块。 它解决的痛是:读代码的人分不清哪些代码还在起作用,花时间去理解一段其实没人用的逻辑,甚至小心翼翼地维护它。

一个价格模块里,旧版的折扣函数早就被新函数取代,但还留在文件里;另一个函数里有一个针对“2019 年双十一”的分支,日期条件永远不会再满足。

"""价格模块:清理前。"""
def old_discount(price: float) -> float: # 2023 年起不再使用
return price * 0.85
def discount(price: float, today: str) -> float:
if today == "2019-11-11":
return price * 0.5
# return price * 0.9 旧规则,先留着
return price * 0.95
if __name__ == "__main__":
print(discount(100, "2026-10-07"))
# 输出:
# 95.0
// 价格模块:清理前。
export function oldDiscount(price: number): number {
// 2023 年起不再使用
return price * 0.85;
}
export function discount(price: number, today: string): number {
if (today === "2019-11-11") return price * 0.5;
// return price * 0.9; 旧规则,先留着
return price * 0.95;
}
console.log(discount(100, "2026-10-07"));
// 输出:
// 95
"""价格模块:清理后。"""
def discount(price: float) -> float:
return price * 0.95
if __name__ == "__main__":
print(discount(100))
# 输出:
# 95.0
// 价格模块:清理后。
export function discount(price: number): number {
return price * 0.95;
}
console.log(discount(100));
// 输出:
// 95

删掉了三样东西:没人调用的 old_discount、永远不会再进入的 2019 年分支、注释掉的旧规则。today 参数只被那个死分支用到,也一并去掉,调用方跟着改(第 6 章)。函数从八行变成两行,读者不用再琢磨“这个分支什么时候会走到”。

移除死代码:删除不会被执行的代码。确认它真的死了的办法:IDE 的 Find Usages 或全文搜索找不到调用方;覆盖率报告显示从未执行;分支的条件在逻辑上不可能成立。注意 IDE 看不到的调用方:通过字符串名字反射调用的函数、配置文件里登记的回调、公开库里被外部用户调用的接口。“以后可能用得上”不是保留的理由,版本控制里永远找得回来,在提交说明里写清删了什么,需要时搜一下提交历史即可。

公开发布的库里的函数,你看不到所有调用方,不能直接删,要先标弃用、过几个版本再删,见第 6 章的迁移式做法。功能开关控制的代码在开关关闭期间看起来是死的,其实只是暂时不走,删之前先确认开关的计划。