第四部分导读:搬移特性
前三部分的手法大多在一个函数或一个类内部打转。这一部分处理的是边界:一个函数、一个字段、几行语句,该住在哪里。
判断标准只有两条。第一,它用谁的数据最多。一个方法如果大部分时间在读另一个类的字段,它就该搬到那个类去,否则那个类每改一次字段,它都得跟着改。第二,它和谁一起变。两段代码总是因为同一个需求被一起修改,就该放在一起;放在两个地方,每次都要记得改两处。
这一部分的手法规模都不大,但做对了,后面的大重构会顺很多:提炼类的步骤里要先搬移字段、再搬移函数;以多态取代条件表达式之前,常常要先把条件逻辑搬到合适的类里。后半部分的几章(移动语句、拆分循环、以管道取代循环、移除死代码)把视角缩到一个函数里,讲语句之间的位置和组织。
| 手法 | 一句话 | 流行度 | 档 |
|---|---|---|---|
| 搬移函数(第 21 章) | 把函数搬到它最常用的数据旁边 | ★★★ | 完整 |
| 搬移字段(第 22 章) | 把字段搬到总和它一起用的类 | ★★ | 精简 |
| 搬移语句到函数 / 搬移语句到调用者(第 23 章) | 每次调用前后都做的事搬进函数;只有部分调用方需要的搬出来 | ★★ | 精简 |
| 以函数调用取代内联代码(第 24 章) | 手写的逻辑换成已有函数 | ★ | 速览 |
| 移动语句(第 25 章) | 把相关的语句挪到一起 | ★ | 速览 |
| 拆分循环(第 26 章) | 一个循环只做一件事 | ★★ | 精简 |
| 以管道取代循环(第 27 章) | 用筛选、映射、归约代替手写循环 | ★★★ | 完整 |
| 移除死代码(第 28 章) | 删掉不再用的代码 | ★ | 速览 |
闻到什么味道先看哪一章:
- 依恋情结,一个方法读别的类的字段比读自己的多 → 第 21 章 搬移函数。
- 霰弹式修改,一个需求要改好几个类 → 第 21 章、第 22 章,把一起变的东西搬到一起。
- 重复代码,每个调用点在调用前后都写着同样几行 → 第 23 章 搬移语句到函数。
- 循环,一个循环里既筛选又转换又累加 → 第 26 章 拆分循环、第 27 章 以管道取代循环。
- 夸夸其谈通用性,有函数和参数没人在用 → 第 28 章 移除死代码。