7Growing Object-Oriented Software, Guided by Tests

遗留代码

测试与遗留系统

特征测试接缝技术安全重构渐进式改进

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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. 逐步添加单元测试

四、本章小结

遗留代码是没有测试的代码。通过接缝技术和特征测试,可以安全地为遗留代码添加测试,然后逐步重构。


五、思考与练习

你的项目有哪些遗留代码?

如何找到接缝?

特征测试和单元测试有什么区别?

如何安全地重构遗留代码?

如何逐步提高遗留代码的测试覆盖?


7/7遗留代码
0%