主题
07. 重构与遗留代码 (Refactoring & Legacy Code)
🧟 核心理念
"Legacy code is simply code without tests." —— Michael Feathers
现实世界中,你 80% 的时间不是在写新代码,而是在维护别人写的(或者你自己半年前写的)烂代码。 学会如何安全地修改烂代码,比学会写新代码更重要。
1. 什么是遗留代码?
遗留代码不仅仅是"旧代码"。 它是那些你不敢修改的代码。 因为它逻辑混乱、没有测试、牵一发而动全身。
2. 安全重构的策略
2.1 黄金主版测试 (Golden Master Testing)
当你面对一个复杂的、没有测试的函数,你想重构它,但怕改坏了。怎么办?
- 快照 (Snapshot): 找一堆真实的输入数据,跑一遍旧代码,把输出结果全部录下来(存文件)。这就是"黄金主版"。
- 重构: 修改代码。
- 验证: 用同样的输入跑新代码,对比输出是否和"黄金主版"一模一样。
这能保证你的重构没有改变行为。
2.2 绞杀植物模式 (Strangler Fig Pattern)
不要试图一次性重写整个系统(Big Bang Rewrite),这通常会失败。 像绞杀植物一样,慢慢地用新代码包裹旧代码。
- 识别边界: 找到你想重构的一个小模块(比如"用户验证")。
- 拦截: 在旧模块的入口处加一个拦截器。
- 路由: 逐步把流量导向新写的模块。
- 替换: 当新模块稳定后,删除旧模块。
3. 识别代码异味 (Code Smells)
学会闻出代码里的"臭味":
- God Class (上帝类): 一个类有 3000 行代码,什么都干。 -> 拆分。
- Duplicated Code (重复代码): Copy-Paste 是万恶之源。 -> 提取函数。
- Long Parameter List (长参数列表): 一个函数有 8 个参数。 -> 引入参数对象。
- Magic Numbers (魔法数字):
if (status === 3)。3 是什么? -> 定义常量/枚举。
4. 防御性编程 (Defensive Programming)
在处理遗留代码时,不要信任它。
- 断言 (Assertions): 在函数入口检查参数合法性。
- Anti-Corruption Layer (防腐层): 如果旧系统的模型很烂,不要让它污染你的新代码。在中间加一层转换层,把烂数据转换成干净的 DTO。
🎯 实战任务
在 Realtime Chat 项目中:
- 故意把一段清晰的代码改写成"烂代码"(大函数、魔法数字)。
- 编写一个测试用例来锁定它的行为(Golden Master)。
- 运用"提取函数"、"重命名变量"等手法,一步步把它重构回清晰的状态,并保证测试一直通过。