Replace Temp With Query (以查询替代临时变量)

以查询替代临时变量

原代码如下:

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;
}

提炼之后,你阅读这些方法调用就像在阅读注释一样,你并不需要管子方法里的细节。

Leave a Comment

Your email address will not be published. Required fields are marked *

PHP 8.1.1 - 18.164 ms, 0 Q