重构之重新组织函数
目的:学习基本重构手法
出处:《重构 改善既有代码的设计》
记录方式:只记录示例代码,深入细节可自行搜索
列表:
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 }