重構第六章
- Extra Method(提煉函數(shù))
當看到一個過長函數(shù)或者需要注釋才能看懂的函數(shù)的時候,將代碼放進一個獨立函數(shù)中
動機(優(yōu)點):
1.每個函數(shù)的粒度都很小
2.函數(shù)之間的復用機會更大
3.函數(shù)的重寫(override)更容易些
Example:
void printOwing(){
Enameration e = _order.elemets();
double outstanding =0.0;
//print banner;
System.out.printIn(){"*****************"};
System.out.printIn(){"***Customer******"};
System.out.printIn(){"*****************"};
//calculate outstanding
while(e.hasMoreElements()) {
Order each =(Order) e.nextElement();
outstanding += each.getAmount();
}
//print details
System.out.printIn("name:",_name);
System.out.printIn("amount": outstanding);
}
Analyse:
示例中函數(shù) printOwing()完成了諸如: print banner、calculate outstanding、print details的功能。
維護者必須閱讀完整的函數(shù),才能夠知曉這個函數(shù)的具體含義。此時我們就需要Extract Method(提煉函數(shù)),使得函數(shù)的功能唯一,同時使得函數(shù)更加的精煉,提升可讀性,可維護性。
首先:將3個功能提煉出來
printBanner:實現(xiàn)打印Banner的作用
void printBanner(){
System.out.printIn(){"*****************"};
System.out.printIn(){"*****Customer****"};
System.out.printIn(){"*****************"};
}
printDetails:實現(xiàn)打印細節(jié)的作用
void printDetails(){
System.out.printIn("name:",_name);
System.out.printIn("amount": outstanding);
}
getOutstanding:實現(xiàn)支出的計算功能
double getOutstanding() {
Enameration e = _order.elemets();
double res =0.0;
while(e.hasMoreElements()){
Order each =(Order) e.nextElement();
outstanding += each.getAmount();
}
return res;
}
其次:將之前函數(shù)的功能處,替換為新的函數(shù)調用
void printOwing() {
printBanner();
double outstanding = getOutstanding();
printDetails(outstanding);
}
Conclusion:
Extract Method(提煉函數(shù))功能可以實現(xiàn)一個過長函數(shù)的提煉,是的程序擁有更好的可讀性。
不過不能過度的使用Extract Method(提煉函數(shù)),使得程序太過冗雜,程序粒度太碎;
同時,Extract Method要求編程人員對變量的命名擁有一定的功力,使得函數(shù)的名稱和具體的功能有一個清晰的映射關系,可以強化代碼的清晰度
注意
重構必須在有單元測試的情況下,保證之前的功能修改后不收影響。切記!?。?/code>