重构研究:Extract Method(提炼函数)
动机:
如果看到一个过长的函数或者函数中有一段代码需要注释时,就需要用Extract Method。
Extract Method完后的好处:第一,函数的粒度变得很小,这样被复用的机会就更大;第二,使用调用函数读起来像是看一系列的注释一样;第三,如果函数的粒度很小,那这样修改就会变得更容易。
注意事项,提炼出来的函数名称一定要能表达这个函数的功能,即这是“做什么的”,这样让调用函数的人可以一目了然。
做法:
本处采用Eclipse自动提炼工具
选中要提炼的代码块,右键“Refactor” -> “Extract Method”,弹出如下窗口

在“Method name”处写入新的函数名,按“OK”,生成新的函数
注意事项:
如果碰到有局部变量的函数,有以下几种情况:
1.局部变量只是做为参数传进子函数,并没有在子函数内容对参数进行附值,就不需要管他们
2.如果有在子函数内部对参数进行赋值,那就先使用Remove Assingments to Parameters(移除参数赋值)
3.如果参数在子函数之后还有调用,而在子函数中又对参数进行了修改,那就要在子函数返回改变后的值,再在主函数中对参数赋值
举个例子:
1 private void printOwing(double previousAmount) { 2 Enumeration<Order> e = orders.elements(); 3 4 double outstanding = previousAmount * 1.2; 5 6 while(e.hasMoreElements()) { 7 Order each = e.nextElement(); 8 outstanding += each.getAmount(); 9 } 10 11 printDetails(outstanding); 12 }
重构后的代码为:
1 private void printOwing(double previousAmount) { 2 double outstanding = previousAmount * 1.2; 3 4 outstanding = getOutstanding(outstanding); 5 6 printDetails(outstanding); 7 } 8 9 private double getOutstanding(double initialValue) { 10 double result = initialValue; 11 12 Enumeration<Order> e = orders.elements(); 13 14 while(e.hasMoreElements()) { 15 Order each = e.nextElement(); 16 result += each.getAmount(); 17 } 18 19 return result; 20 }
浙公网安备 33010602011771号