以查询替代临时变量
原代码如下:
double basePrice = _quantity * _itemPrice;
if(basePrice > 10000){ // 大于1万折扣不一样
return basePrice * 0.95;
} else {
return basePrice * 0.98
}
将临时变量 basePrice 替换为查询:
```java
重构为
```java
if(basePrice() > 10000){
return basePrice() * 0.95;
} else {
return basePrice() * 0.98;
}
double basePrice(){
return _quantity * _itemPrice;
}
这里虽然多封装了一层,但代码更加模块化,也不需要basePrice这个临时变量。代码可读性提高了。
Introduce Explaining Variable (引入解释性变量)
if条件判断太长,难以阅读,可以引入解释性变量的方式让条件判断阅读起来变得容易
if((platform.toUpperCase().indexOf("MAC") > -1) && (platform.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0) {
// do something.
}
重构为
final boolean isMacOS = platform.toUpperCase().indexOf("MAC");
final boolean isIEBrowser = platform.toUpperCase().indexOf("IE");
final boolean wasResized = resize > 0;
if(isMacOS && isIEBrowser && wasInitialized() && wasResized) {
// do something
}
人肉解析是痛苦的,好代码应该想阅读文章一样轻松愉快
Extract Method (提炼方法,也就是封装)
void printOwing(double previousAmount){
Enumeration e = _orders.elements();
double outstanding = previousAmount * 1.2;
printBanner();
// calculate outstanding
while(e.hasMoreElements()) {
Order each = (Order)e.nextElement();
outstanding += each.getAmount();
}
}
提炼后的代码可能是这样:
提炼思路: 如果你在一个方法内部罗列了一系列逻辑比如:1.查询所有订单, 2.计算基础价格,3.打印banner,4.计算金额,5.打印债务详情。 如果你能这么列来,那么这些步骤都可以提炼成单独的方法。而最外层的这个主方法里得到实现细节就很少,你只需要看里面每个子方法的方法名就能知道每一步做什么。
void printOwing(double previousAmount){
double outstanding = previousAmount * 1.2;
printBanner();
outstanding = getOutstanding(outstanding);
printDetails(outstanding);
}
double getOutstanding(double initialValue){
double result = initialValue;
Enumeration e = _orders.elements();
while(e.hasMoreElements()) {
Order each = (Order) e.nextElement();
result += each.getAmount();
}
return result;
}
提炼之后,你阅读这些方法调用就像在阅读注释一样,你并不需要管子方法里的细节。