重构之重新组织函数

目的:学习基本重构手法

出处:《重构 改善既有代码的设计》

记录方式:只记录示例代码,深入细节可自行搜索

列表:

1、Extract Method(提炼函数)

2、Inline Temp(内联临时变量)

3、Replace Temp with Query(以查询取代临时变量)

4、Introduce Explaining Variable(引入解释性变量)

5、Split Temporary Variable(分解临时变量)

6、Remove Assignments to Parameters(移除对参数的赋值)

7、Substiture Algorithm(替换算法)

 

一、Extract Method(提炼函数)

 

你有一段代码可以被组织在一起并独立出来。

将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。

 

1 void printOwing(double amount){
2        printBanner();
3        System.print("name:" + _name);
4        System.print("name:" + amount);
5      }
1 void printOwing(double amount){
2        printBanner();
3        printDetails(amount);
4 }
5 
6 void printDetails(double amount){
7        System.print("name:" + _name);
8        System.print("name:" + amount);
9 }

 

二、Inline Temp(内联临时变量)

 

你有个临时变量,只是被简单表达式赋值一次,而它妨碍了其他重构手法。

将所有对该对象的引用动作,替换为对它赋值的那个表达式自身。

 

1 double basePrice = anorder.basePrice();
2 return (basePrice > 1000)
1 return (anOrder.basePrice() > 1000)

 

三、Replace Temp with Query(以查询取代临时变量)

 

你的程序以一个临时变量保存某一表达式的运算结果。

将这个表达式提炼到一个独立函数中,将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。

 

1 double basePrice = _quantity * _itemPrice;
2       if(basePrice  >1000){
3              return basePrice  * 0.95;
4        }else{
5              return basePrice  * 0.98;
6        }
if(basePrice() > 1000){
    return basePrice() * 0.95;
}else{
    return basePrice() * 0.98;
}
...
double basePrice(){
     return _quantity * _itemPrice;
}

 

四、Introduce Explaining Variable(引入解释性变量)

 

你有一个复杂的表达式

将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。

 

1 if((platform.toUpperCase().indexOf("MAC") > -1 )&&
2    (brower.toUpperCase().indexOf("IE") > -1 )&&
3      wasInititialized() && resize > 0 ) ){
4     //do something
5 }
final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = platform.toUpperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0;

if(isMacOs && isIEBrowser && wasResized ){
     //do  something
}

 

五、Split Temporary Variable(分解临时变量)

 

你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果。

针对每次赋值,创造一个独立、对应的临时变量。

 

 double temp = 2 * (_height * _width);
System.out.println(temp);
temp = _height * _width;
System.out.println(temp);
1 double temp = 2 * (_height * _width);
2 System.out.println(perimeter);
3 final double area = _height * _width;
4 System.out.println(area);

 

六、Remove Assignments to Parameters(移除对参数的赋值)

 

代码对一个参数进行赋值。

以一个临时变量取代该参数的位置。

 

1 int discount (int inputVal,int quantity,int yearToDate){
2    if(inputVal > 50 ) inputVal -= 2;
3 }
int discount (int inputVal,int quantity,int yearToDate){
   int result =  inputVal;
   if(inputVal > 50 ) result  -= 2;
}

 

七、Substiture Algorithm(替换算法)

 

你想要把某个算法替换为另一个更清晰的算法。

将函数本体替换为另一个算法。

 

 1 String foundPerson(String[] people){
 2       for(int i = 0;i < people.length;i++){
 3             if(people[i].equals("Don")){
 4                return "Don";
 5             }
 6             if(people[i].equals("John")){
 7                return "John";
 8             }
 9             if(people[i].equals("Kent")){
10                return "Kent";
11             }
12        }
13         return "";
14 }
1 String foundPerson(String[] people){
2       List candidates = Arrays.asList(new String[] {"Don","John","Kent"});
3       for(int i = 0;i < people.length;i++){
4             if(candidates.contains(people[i])){
5                return people[i];
6             }
7        }
8         return "";
9 }

 

点赞