《重构》——改善既有代码的设计
重构(Refactoring):在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。 —— Martin Fowler
一、全书概览
《重构》是软件工程领域的经典著作,由 Martin Fowler 主笔,Kent Beck 等多位领域专家合著部分章节。全书构建了一套系统化的代码改进方法论:将”整理代码”从随性的手工活,变成有步骤、可验证、低风险的工程行为。
核心主张:软件的设计不是写代码前一次性完成的,而是在开发过程中通过持续重构逐步浮现、持续优化的。好代码不是一开始就写对的,而是不断改出来的。
全书结构(15章 + 附录)
| 部分 | 章节 | 核心内容 |
|---|---|---|
| 基础篇 | 第1章 | 重构入门案例:一个影片租赁小程序的完整重构过程 |
| 第2章 | 重构的定义、原则、时机、与设计/性能的关系 | |
| 第3章 | 代码的”坏味道”(22种)——识别何时该重构 | |
| 第4章 | 构筑测试体系——重构的安全网 | |
| 第5章 | 重构列表的使用方法 | |
| 重构手法篇 | 第6章 | 重新组织函数(9种手法) |
| 第7章 | 在对象之间搬移特性(8种手法) | |
| 第8章 | 重新组织数据(16种手法) | |
| 第9章 | 简化条件表达式(8种手法) | |
| 第10章 | 简化函数调用(15种手法) | |
| 第11章 | 处理概括关系(继承体系,12种手法) | |
| 第12章 | 大型重构(4种重量级手法) | |
| 延伸篇 | 第13章 | 重构、复用与现实(Bill Opdyke) |
| 第14章 | 重构工具(Don Roberts & John Brant) | |
| 第15章 | 总结(Kent Beck 压轴) |
二、核心概念
1. 重构 vs 重做
重构不是重做(redo)。重做是推倒重来,重构是在保留现有功能的前提下改进代码结构。
2. 重构的两大要素
- 坏味道(Code Smells):代码中的警示信号,表明可能存在设计问题
- 重构手法(Refactoring Techniques):具体的变换步骤,逐步改进代码
3. 何时重构
- 添加功能时
- 审查代码时发现问题
- 编写单元测试时
- 代码异味出现时
三、代码的22种坏味道
- 神秘命名(Mysterious Name)
- 重复代码(Duplicate Code)
- 过长函数(Long Function)
- 过大数据团(Data Clumps)
- 过长参数列(Long Parameter List)
- 可变数据(Mutating Data)
- 发散式变化(Divergent Change)
- 霰弹式修改(Shotgun Surgery)
- 依恋情妇(Feature Envy)
- 数据泥团(Data Clumps)
- 基本类型偏执(Primitive Obsession)
- 替代算法(Switch Statements)
- 并行继承体系(Parallel Inheritance Hierarchies)
- 冗赘类(Lazy Class)
- 夸夸其谈通用性(Speculative Generality)
- 临时字段(Temporary Field)
- 人云亦云(People Pyramid)
- 注释(Comments)—— 本意是好的,但通常是代码不足的掩饰
四、核心重构手法举例
提取函数(Extract Function)
// Before
void printOwing() {
printBanner();
// print details...
}
// After
void printOwing() {
printBanner();
printDetails(details);
}
内联函数(Inline Function)
当函数体比函数名更有价值时,可以将函数调用替换为函数体。
移动函数(Move Function)
当一个函数大量引用另一个类中的元素时,考虑将其移动过去。
五、重构与安全网
单元测试的重要性
重构的前提是有充分的测试覆盖。测试是重构的安全网,确保修改不会破坏现有功能。
重构的步骤
- 选择重构对象
- 理解当前行为
- 编写测试
- 执行重构
- 运行测试验证
- 删除冗余测试
六、与其他知识的关联
- SICP - 计算机程序的构造和解释 - 编程思维的基础
- 密码学的乐趣 - 复杂系统的抽象设计
- 敏捷软件开发 - 重构是敏捷实践的核心
处理状态: 本书已有完整的中文笔记,无需重复处理。原PDF为水印版,本次跳过。