重构第六章
- Extra Method(提炼函数)
当看到一个过长函数或者需要注释才能看懂的函数的时候,将代码放进一个独立函数中
动机(优点):
1.每个函数的粒度都很小
2.函数之间的复用机会更大
3.函数的重写(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:
示例中函数 printOwing()完成了诸如: print banner、calculate outstanding、print details的功能。
维护者必须阅读完整的函数,才能够知晓这个函数的具体含义。此时我们就需要Extract Method(提炼函数),使得函数的功能唯一,同时使得函数更加的精炼,提升可读性,可维护性。
首先:将3个功能提炼出来
printBanner:实现打印Banner的作用
void printBanner(){
System.out.printIn(){"*****************"};
System.out.printIn(){"*****Customer****"};
System.out.printIn(){"*****************"};
}
printDetails:实现打印细节的作用
void printDetails(){
System.out.printIn("name:",_name);
System.out.printIn("amount": outstanding);
}
getOutstanding:实现支出的计算功能
double getOutstanding() {
Enameration e = _order.elemets();
double res =0.0;
while(e.hasMoreElements()){
Order each =(Order) e.nextElement();
outstanding += each.getAmount();
}
return res;
}
其次:将之前函数的功能处,替换为新的函数调用
void printOwing() {
printBanner();
double outstanding = getOutstanding();
printDetails(outstanding);
}
Conclusion:
Extract Method(提炼函数)功能可以实现一个过长函数的提炼,是的程序拥有更好的可读性。
不过不能过度的使用Extract Method(提炼函数),使得程序太过冗杂,程序粒度太碎;
同时,Extract Method要求编程人员对变量的命名拥有一定的功力,使得函数的名称和具体的功能有一个清晰的映射关系,可以强化代码的清晰度
注意
重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!
网友评论