组织函数
extract method #提 #取 #代 #码
将一段代码放到独立函数中,并让函数名称解释
创建新函数,以他做什么来命名
提炼的代码从原函数复制到新函数
检查代码,查看是否含有局部变量
仅用于提炼代码段的局部变量在新函数中声明
如果有修改局部变量将提炼函数改为查询,赋值给变量多个变量被修改使用split temporary variable
将被提炼代码段中需要读取的局部变量,当作参数传递给目标函数
将源码中的代码段替换为函数
inline method #将 #调 #用 #替 #换 #为 #函 #数 #体
内部代码同样清晰易读
组织不合理的函数,内联到一个大函数中,重新提炼
检查函数,确认其不具有多态性
找出这个函数所有被调用点
将这个函数的所有被调用点都替换为函数主体
测试
删除原函数
inline temp #内 #联 #临 #时 #变 #量
临时变量只被一个简单的表达式赋值一次,而它妨碍了其他重构手法
临时变量赋值语句等号右边表达式没有副作用
声明为final
找到引用点,替换为表达式
删除该赋值语句
replace temp with query #去 #掉 #临 #时 #变 #量 #, #以 #查 #询 #替 #代 #临 #时 #变 #量
不用担心性能问题,基本不会造成影响
找出只被赋值一次的临时变量
声明为final
等号右侧部分提炼到一个独立函数中,private
inline temp
introduce explaining variable #引 #入 #解 #释 #性 #变 #量
复杂表达式或其中一部分放入临时变量中,用变量名解释表达式用途
声明一个final 临时变量,将表达式一部分动作的运算结果赋值给它
将表达式的运算结果这一部分替换为临时变量
split temporary variable #将 #临 #时 #变 #量 #容 #易 #替 #换 #分 #解 #临 #时 #变 #量
一个临时变量被多次赋值,针对每次赋值,创建一个独立对应的临时变量
如果一个变量承担多个责任,具有多个意义,就应该被分解为多次变量,,尽量只赋值一次,只承担一个责任
在待分解临时变量的声明及其第一次赋值处,修改其名称
声明为final
以第二次赋值动作为界限,修改此前对该临时变量的所有引用点
第二次赋值处,重新声明那个变量
重复上述操作
replace method with method object #分 #解 #最 #混 #乱 #的 #函 #数 #, #以 #函 #数 #对 #象 #取 #代 #函 #数
大型函数,无法采用extractmethod,将函数放到单独对象中,局部变量变为对象字段。在同一个对象中将这个大型函数分解
建立新类
建立final 字段,用以保存原先大型函数所在的对象-源对象。同时将函数中的每个临时变量和参数在新类中建立字段
建立构造函数接受原对象的所有参数作为参数
建立一个compute()函数
将原函数代码复制到comoute函数中。
将旧函数的函数题替换为这样一句:创建上述新类的一个新对象,而后调用其中的compute()
remove assignMents to parameters #移 #除 #对 #参 #数 #的 #赋 #值
用临时变量替代方法中对参数的赋值,如果是对象,对对象内部进行操作是可以的,但是不要将对象重新赋值。
建立临时变量,待处理参数赋值给它
对参数赋值为界,将其后所有对此参数的引用点全部替换为对此临时变量的引用
修改赋值语句,使其改为对临时变量的赋值
Substitute algorithm #引 #入 #更 #清 #晰 #的 #算 #法
准备新算法
针对现有测试,执行新算法,通过
替换