一段关于重构的小代码

首先,来一段小代码。

double getPrice(){
    int basePrice = _quantity * _itemPrice;
    double discountFactor;
    if (basePrice > 1000) {
        discountFactor = 0.95;
    } else {
        discountFactor = 0.98;
    }
    return basePrice * discountFactor;
}

尽管代码十分清晰,我还是先把临时变量声明为final,检查它们是否的确只被赋值一次:

double getPrice(){
    final int basePrice = _quantity * _itemPrice;
    final double discountFactor;
    if (basePrice > 1000) {
        discountFactor = 0.95;
    } else {
        discountFactor = 0.98;
    }
    return basePrice * discountFactor;
}

这样的话,如果有任何问题,编译器就会警告我。之所以我先做这件事,因为如果临时变量不只被赋值一次,我就不该进行这项重构。接下来,开始替换掉临时变量吧,每次一个。首先,我把赋值动作的右侧表达式提炼出来:

double getPrice(){
    final int basePrice = basePrice();
    final double discountFactor;
    if (basePrice > 1000) {
        discountFactor = 0.95;
    } else {
        discountFactor = 0.98;
    }
    return basePrice * discountFactor;
}

private int basePrice(){
    return _quantity * _itemPrice;
}

编译并测试,然后开始使用Inline Temp(119).首先把临时变量basePrice的第一个引用点替换掉:

double getPrice(){
    final int basePrice = basePrice();
    final double discountFactor;
    if (basePrice() > 1000) {
        discountFactor = 0.95;
    } else {
        discountFactor = 0.98;
    }
    return basePrice * discountFactor;
}
private int basePrice() {
    return _quantity * _itemPrice;
}

编译测试,下一个。由于“下一个”已经是basePrice的最后一个引用点,所以我把basePrice临时变量的申明式一并去掉:

double getPrice(){
    final double discountFactor;
    if (basePrice() > 1000) {
        discountFactor = 0.95;
    } else {
        discountFactor = 0.98;
    }
    return basePrice() * discountFactor;
}
private int basePrice() {
    return _quantity * _itemPrice;
}

搞定basePrice之后,我再以类似办法提炼出discountFactor();

double getPrice(){
    final double discountFactor = discountFactor();
    return basePrice() * discountFactor;
}
private int basePrice() {
    return _quantity * _itemPrice;
}
private double discountFactor() {
    if (basePrice() > 1000) {
        return 0.95;
    } else {
        return 0.98;
    }
}

最后,getPrice()变成了这样:

double getPrice(){
    return basePrice() * discountFactor();
}

你可能感兴趣的:(优化,重构)