《重构改善既有代码的设计 》读书笔记之重新组织函数

1、Extract Method(提炼函数)

动机
当我看到一个过长的函数或者一段注释才能让人理解的用途的代码,我就会将这段代码放入一个独立的函数中。
首先,如果每个函数的粒度都很小,那么函数被复用的机会就越大;其次,这会使高层函数读起来像一系列注释;再次,若函数都是细粒度,那么函数的覆写也会容易些。
做法

  1. 创建一个新函数,根据这个函数的意图来对它命名(以它“做什么命名,而不是以它“怎么做”命名)。
  2. 将提炼的代码从源函数复制到新建的目标函数中。
  3. 检查提炼代码,是否存在引用了作用域在源函数的变量。
  4. 检查被提炼的代码段,如果一个临时变量的值被修改了,看看能不能把提炼代码段处理为一个查询并赋值给相关变量。如果多个,可以分解临时变量或者以查询替代临时变量。
  5. 将被提炼代码段中的需要读取的局部变量,当作参数传入目标函数。
2、Inline Method(内联函数)

动机
有时候你会遇到某些函数,其内部代码和函数名称一样清晰易读。果真如此,你就应该去掉这个函数,直接使用其中的代码。间接性可能带来帮助,但是非必要的间接性总是让人不舒服。
另一种情况是有一群组织不甚合理的函数。你可以将其内联到一个大函数中,再从中提炼组织合理的小型函数中。
做法

  1. 检查函数,确定它不具有多态性,子类无法覆写一个不存在的函数。
  2. 找出这个函数的所有被调用点
  3. 将这个函数所有调用点替换为函数本体。
3、Inline Temp(内联临时变量)

动机
多半作为Replace Temp with Query(以查询取代临时变量)的一部分使用。单独使用只有当发现某个临时变量被赋予某个函数调用的返回值。
做法

  1. 找到该临时变量的所有引用点,将它替换为“为临时变量赋值”的表达式。
  2. 修改完所有引用点后删除该临时变量的声明及赋值语句。
4、Replace Temp with Query(以查询取代临时变量)

动机
临时变量的问题在于:他们是暂时的,而且只能在所属的函数内使用。
做法

  1. 简单的情形(临时变量只赋值一次或赋值给临时变量的表达式不受其他条件影响)
  2. 找出只赋值一次的临时变量,如果赋值超过一次则考虑分解临时变量。
  3. 将临时变量声明为final。
  4. 将“对临时变量赋值”之语句等号右侧部分提炼到独立函数中。
  5. 在该变量实施Inline Temp(内联临时变量)
5、Introduce Explaining Variable(引入解释性变量)

假如你有一个复杂的表达式,将该复杂表达式(或一部分)的结果放进一个临时变量,以此变量名称来杰丝表达式用途。
动机
表达式有可能非常复杂而难于阅读。这种情况下,临时变量可以帮助你将表达式分解为比较容易管理的形式。
做法

  1. 声明一个final临时变量,将待分解之复杂表达式中的一部分动作的运算结果赋值给它。
  2. 将表达式中的“运算结果”这一部分,替换为上述临时变量。
6、Split Temporary Variable(分解临时变量)

有的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于搜集计算结果。可以对于每次赋值,创建一个独立、对应的临时变量。
动机
循环变量会随着循环的每次运行而改变。结果搜集变量负责把通过整个函数的运算而构成的某个值搜集起来,如i = i + 某表达式,结果搜集变量作用通常是累加、字符串接合、写入流或向集合添加元素。
除了这两种情况,如果临时变量被赋值超过一次,就意味着在函数中承担了超过一个以上的责任,就应该分解。
做法

  1. 对待分解临时变量第一次赋值处修改名字
  2. 以第二次赋值为界,修改该界之前的所有引用点。
  3. 第二次赋值处,重新声明
  4. 重复1-3步骤
7、Remove Assignments to Parameters(移除对参数的赋值)

java只采用按值传递,在按值的情况下,对参数的任何修改都不会对调用端造成影响,所以在Java不要对参数赋值。

8、Replace Method with Method Object(以对象取代函数)

你有一个大型的函数,其中对局部变量的使用使你无法采用提炼函数。
可以将这个函数放入一个单独对象中,如此一来局部变量就变成对象内的字段。然后你可以在同一个对象中将这个大型函数分解成多个小型函数。
动机
如果一个函数局部变量泛滥成灾,分解函数相当困难,Replace Method with Method Object(以对象取代函数)会将所有局部变量变成函数对象的字段。然后你就可以对这个新对象使用提炼函数创建出新函数,将大型函数拆短。
做法

  1. 建立新类,根据待处理函数用途命名。
  2. 针对原函数的每个临时变量和每个参数,在新类建立一个对应的字段保存之。
  3. 在新类建立一个构造函数,接收源对象及原函数的所有参数作为参数。
  4. 在新类建立相应的新的函数。
9、Substitute Algorithm(替换算法)

你想要把某个算法替换为另一个更清晰的算法,将函数本体替换为另一个算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值