外观
《重构》:一本用来「查」的书
约 1187 字
《重构》:一本用来「查」的书
《重构:改善既有代码的设计》是神作,但大多数人的打开方式是错的 —— 抱着通读,从「第一个重构手法」读到「第一百个」, 读到第四个就睡着了。它是 catalogue(目录/手法集),不是小说。
这篇讲我的「查字典式」读法,配几个真实案例。
一、这本书的正确定位
想象一本「菜谱」:你不会从第一页读到最后一页, 而是「今天想做红烧肉 → 翻到红烧肉那一页」。 重构手册同理:
闻到坏味道 → 翻到对应手法 → 照着做 → 跑测试全书结构也支持这么读:
- 第 1-3 章:什么是重构、坏味道清单、测试的重要性 (这几章通读);
- 第 4-12 章:六大类几十个手法(当字典);
- 附录:代码坏味道速查(贴墙级别)。
二、第 1-3 章值得每个团队共读
「两顶帽子」
开发时分两种模式:加功能(别动老代码,快速堆)和 重构(别加功能,慢慢改)。两顶帽子别同时戴 —— 「边加功能边重构」是事故之源:功能有 bug 说不清是新写的 还是重构改坏的。
「小步前进,频繁测试」
每个重构手法都是「几分钟 + 跑一次测试」的粒度。 Fowler 的原话精神:步子小到「错了立刻发现」。 配合自动化测试,重构就是安全操作;没有测试, 重构就是裸奔。
测试是重构的保险丝
「没有测试就不重构」是书里最务实的建议。 我见过没测试直接大重构,上线后回滚三天的惨案。 重构前先补测试,测试齐了再动手,慢就是快。
三、三个我用得最多的手法
提炼函数(Extract Function)
坏味道:长函数。手法:把「一段能说清目的的代码」变成 独立函数,用「它做什么」命名。
真实案例:一段 200 行的订单处理,抽出 validateOrder、calculateDiscount、persistOrder 三个函数。 抽完主流程读起来像大纲,细节进各自函数。 重构第一课,也是用得最多的一课。
以多态取代条件表达式
坏味道:switch 散落。手法:把分支逻辑变成子类。
// 重构前
if (bird.type === '欧洲燕') speed = 35
else if (bird.type === '非洲燕') speed = 40
else if (bird.type === '挪威蓝') speed = 50 // 还会被拔毛
// 重构后:bird.speed(),每种鸟自己算注意书里也提醒:类型码少且稳定时,switch 也挺好。 别为了「面向对象洁癖」过度设计。
引入参数对象
坏味道:参数列表长(f(a, b, c, d, e, f))。手法: 把相关参数包成对象。
// 重构前
function query(start, end, status, page, size, sort) { … }
// 重构后
function query({ start, end, status, page, size, sort }: QueryParams) { … }现在 TS 项目默认就这么写,源头在这。 加新参数不用改签名是这个手法最实在的好处。
四、我的「坏味道」速查(实战版)
日常 code review 闻到最多的:
| 味道 | 第一反应手法 |
|---|---|
| 长函数 | 提炼函数 |
| 大类 | 提炼类 |
| 过长参数列 | 引入参数对象 |
| 发散式变化(一类改动动全文件) | 拆模块 |
| 霰弹式修改(一类改动动半个项目) | 搬移函数/内联 |
| 重复代码 | 提炼函数/函数上移 |
| 神秘命名 | 改名(改名前先全局搜索) |
| 临时字段 | 提炼类 |
这份贴在显示器旁,review 时对照。
五、电子版时代的读法
第二版(2024 年出的新版)用 JavaScript 重写了所有示例 —— 前端读着舒服多了(第一版是 Java)。买新版。
替代/补充资源:
- Refactoring Guru(有中文): 图解重构模式,配动画,当「速查手册」极顺;
- Refactoring.com: 官方在线目录,免费看手法清单。
六、三个使用原则
- 先有测试再重构。书里第一章的忠告,血的浓度最高;
- 小步 + 频繁验证。别攒一个「大重构 PR」 —— 评审人看不完,你也说不清改了多少;
- 重构和功能分开提交。commit message 写清楚 哪个是重构、哪个是功能 —— 出问题时回滚有依据。
小结
《重构》的正确打开方式:前三章读透,手法部分当字典, 附录贴墙。它的价值不在「读完」,在「每次 code review 都能翻到对应的手法」。配着 Refactoring Guru 的动画版看,效果最佳。
本站的工作流(在新窗口打开)里提过: 「先 review 后动手」—— 重构正是 review 的出口。