第7章:遗留代码(Legacy Code)
一、导读
1.1 本章学习目标
第7章讲解如何用测试处理遗留代码。遗留代码是没有测试的代码,处理它需要特殊的策略。
1.2 为什么第七章如此重要
现实中的大部分工作是在遗留系统上进行的。学会处理遗留代码是必备技能。
1.3 核心问题引导
什么是遗留代码?
如何为遗留代码添加测试?
接缝技术是什么?
如何安全地重构遗留代码?
二、核心概念详解
7.1 遗留代码的定义
遗留代码 = 没有测试的代码
特征:
- 没有测试覆盖
- 设计可能很差
- 文档可能缺失
- 原始开发者可能已离职7.2 接缝技术
接缝(Seam):可以在不修改代码的情况下改变行为的地方
接缝类型:
- 链接接缝:替换依赖的库
- 预处理接缝:通过宏替换
- 对象接缝:替换对象创建
示例:
public class Legacy {
public void process() {
// 直接创建依赖(难以测试)
Database db = new Database();
db.query(...);
}
}
// 引入接缝
public class Legacy {
private DatabaseFactory factory;
public Legacy(DatabaseFactory factory) {
this.factory = factory;
}
public void process() {
Database db = factory.create();
db.query(...);
}
}7.3 特征测试
java
// 为遗留代码编写特征测试
// 不关心正确性,只关心行为
@Test
public void characterTest() {
LegacySystem system = new LegacySystem();
String result = system.process(input);
// 记录当前行为,作为基线
assertEquals("expected output from current code", result);
}三、实战案例
7.1 安全重构遗留代码
步骤:
1. 识别变化点
2. 找到接缝
3. 引入测试接缝
4. 编写特征测试
5. 安全重构
6. 逐步添加单元测试四、本章小结
遗留代码是没有测试的代码。通过接缝技术和特征测试,可以安全地为遗留代码添加测试,然后逐步重构。
五、思考与练习
你的项目有哪些遗留代码?
如何找到接缝?
特征测试和单元测试有什么区别?
如何安全地重构遗留代码?
如何逐步提高遗留代码的测试覆盖?