跳转到内容

第四部分导读:搬移特性

前三部分的手法大多在一个函数或一个类内部打转。这一部分处理的是边界:一个函数、一个字段、几行语句,该住在哪里。

判断标准只有两条。第一,它用谁的数据最多。一个方法如果大部分时间在读另一个类的字段,它就该搬到那个类去,否则那个类每改一次字段,它都得跟着改。第二,它和谁一起变。两段代码总是因为同一个需求被一起修改,就该放在一起;放在两个地方,每次都要记得改两处。

这一部分的手法规模都不大,但做对了,后面的大重构会顺很多:提炼类的步骤里要先搬移字段、再搬移函数;以多态取代条件表达式之前,常常要先把条件逻辑搬到合适的类里。后半部分的几章(移动语句、拆分循环、以管道取代循环、移除死代码)把视角缩到一个函数里,讲语句之间的位置和组织。

手法 一句话 流行度 档
搬移函数(第 21 章) 把函数搬到它最常用的数据旁边 ★★★ 完整
搬移字段(第 22 章) 把字段搬到总和它一起用的类 ★★ 精简
搬移语句到函数 / 搬移语句到调用者(第 23 章) 每次调用前后都做的事搬进函数;只有部分调用方需要的搬出来 ★★ 精简
以函数调用取代内联代码(第 24 章) 手写的逻辑换成已有函数 ★ 速览
移动语句(第 25 章) 把相关的语句挪到一起 ★ 速览
拆分循环(第 26 章) 一个循环只做一件事 ★★ 精简
以管道取代循环(第 27 章) 用筛选、映射、归约代替手写循环 ★★★ 完整
移除死代码(第 28 章) 删掉不再用的代码 ★ 速览

闻到什么味道先看哪一章:

  • 依恋情结,一个方法读别的类的字段比读自己的多 → 第 21 章 搬移函数。
  • 霰弹式修改,一个需求要改好几个类 → 第 21 章、第 22 章,把一起变的东西搬到一起。
  • 重复代码,每个调用点在调用前后都写着同样几行 → 第 23 章 搬移语句到函数。
  • 循环,一个循环里既筛选又转换又累加 → 第 26 章 拆分循环、第 27 章 以管道取代循环。
  • 夸夸其谈通用性,有函数和参数没人在用 → 第 28 章 移除死代码。