Extract Method 提炼函数
- 1、函数过长时或者一段代码需要进行注释时提炼出来;
- 2、函数的复用度也会较大;
- 3、不同的函数做的事情不同,通过名字就可以看出;
- 4、如果提炼出来的函数会涉及多个变量的改动,使用Split Temporary Variable后再进行提炼;或者使用Replace Temp with Query;
Inline Method:内联函数
- 1、跟Extract Method刚好相反;
- 2、一个函数的本体与名称同样清楚易懂,可以去掉该函数,直接使用代码;
public int getRating() {
int numberOfLateDelivery = 5;
return moreThanFiveLateDeliveries(numberOfLateDelivery) ? 2 : 1;
}
private boolean moreThanFiveLateDeliveries(int numberOfLateDelivery) {
return numberOfLateDelivery > 5;
}
- 3、有很多不合理的小函数,可以将其重新内联到一个大函数后,再提取合理的小函数;
- 4、使用了太多的间接层,简单委托;
需要将其内联后,去掉无效的间接层;
- 5、不能内联的几种情况;
有子类继承了的函数、递归调用、多返回点、内联至另一个对象中而该对象并无提供访问函数;
Inline Temp:内联临时变量;
- 1、一个临时变量只被使用了一次,则去掉该临时变量,将其替换为表达式;
double basePrice = anOrder.basePrice;
return (basePrice > 100);
return anOrder.basePrice > 100;
Replace Temp with Query:以查询取代临时变量
- 1、将一个临时变量的右侧表达式提取出来成为一个函数;
double basePrice = quality * itemPrice;
if (basePrice > 100) {
return basePrice * 0.95;
} else {
return basePrice * 0.98;
}
变成
if (basePrice(quality, itemPrice) > 100) {
return basePrice(quality, itemPrice) * 0.95;
} else {
return basePrice(quality, itemPrice) * 0.98;
}
private double basePrice(Bigdecimal quality, double itemPrice) {
return quality * itemPrice;
}
- 2、如果临时变量被赋值超过一次,则使用Split Temporary Variable;
- 3、操作之前,将临时变量前先加上final,检测是否只赋值了一次;
Introduce Explaining Variable:引入注释性变量
- 1、将复杂表达式(或其中一部分)的结果放入一个临时变量中,此临时变量来表达此表达式的含义;
if ((platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0) {
//doSomething
}
变成:
final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0;
if (isMacOs && isIEBrowser && wasInitialized() &&wasResized) {
//doSomething
}
- 2、Introduce Explaining Variable方式经常可以使用Extract Method替代,因为临时变量只在当前方法中才起作用,而提炼方法则可以被其他方法复用;
- 3、当使用Extract Method提炼方法比较麻烦时,可以使用Introduce Explaining Variable;
- 4、可以使用其来帮助理解代码逻辑;