重新组织函数
提炼函数
做法
- 将某段代码放进一个独立函数中,并让函数名称解释该函数的用途。
- 检查提炼出来的代码,是否引用了“作用域限于源函数”的变量
- 检查是否有“仅用于被提炼代码段”的临时变量。如果有,在目标函数中将其声明为临时变量。
- 检查被提炼代码段,临时变量的值是否被修改。如果有,可以将临时变量处理为一个查询返回结果。
- 将被提炼代码段中需要读取的局部变量,当做参数传给目标函数。
以查询代替临时变量
当程序以一个临时变量保存某一表达式的运算结果时,可以将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。同时,新函数可被其他函数调用。
做法
- 找出只被赋值一次的临时变量
- 将该临时变量声明为final
- 将“对该临时变量赋值”的语句的等号右侧部分提炼到一个独立函数中(该独立函数一般声明为private)。
引入解释性变量
对于复杂表达式,将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。
做法
- 声明一个final临时变量,将待分解的复杂表达式中的一部分动作的运算结果赋值给它。
- 将表达式中的“运算结果”这一部分,替换为上述临时变量。
分解临时变量
如果程序中的某个临时变量的赋值超过一次,它既不是循环变量,也不被用于收集计算结果,那么,针对每次赋值,创造一个独立、对应的临时变量。
做法
- 在待分解临时变量的声明及其第一次被赋值处,修改其名称。
- 将新的临时变量声明为final。
- 以该临时变量的第二次赋值动作为界,修改此前对该临时变量的所有引用点,让它们引用新的临时变量。
- 在第二次赋值处,重新声明原先那个临时变量。
- 逐次重复上述过程。
移除对参数的赋值
当代码对一个参数进行赋值,需要以一个临时变量取代该参数的位置。
(原来对参数进行赋值的做法,降低了代码的清晰度,混用了按值传递和按引用传递这两种参数传递方式。Java只采用按值传递方式)
做法
- 建立一个临时变量,把待处理的参数赋值给它。
- 以“对参数的赋值”为界,将其后所有对此参数的引用点,全部替换为“对该临时变量的引用”。
- 修改赋值语句,使其改为对新建的临时变量赋值。