最后的重构(1)

最后的重构(1)
运用多态(polymorphism)取代与价格相关的条件逻辑
这个问题的第一部分是switch语句。在另一个对象的属性(attribute)基础上运用switch语句,并不是什么好注意。如果不得不使用,也应该在对象自己的数据上使用,而不是在别人的数据上使用。
class Rental...
double getCharge() {
    double result = 0;
    switch( getMovie().getPriceCode()) {   //取得影片出租价格
          case Movie.REGULAR:   //普通片
             result+= 2;
             if(getDaysRented() > 2)
                result+= (getDaysRented() - 2) * 1.5;
             break;
          case Movie.NEW_RELEASE:   //新片
             result+= getDaysRented() * 3;
             break;
          case Movie.CHILDRENS:   //儿童片
             result+= 1.5;
             if(getDaysRented() > 3)
                result+= (getDaysRented() - 3) * 1.5;
             break;
       }
    return result;
}

这暗示getCharge()应该移到Movie class里头去:
class Movie...
double getCharge(int daysRented) {
    double result = 0;
    switch(getPriceCode()) {   //取得影片出租价格
          case Movie.REGULAR:   //普通片
             result+= 2;
             if(getDaysRented() > 2)
                result+= (getDaysRented() - 2) * 1.5;
             break;
          case Movie.NEW_RELEASE:   //新片
             result+= getDaysRented() * 3;
             break;
          case Movie.CHILDRENS:   //儿童片
             result+= 1.5;
             if(getDaysRented() > 3)
                result+= (getDaysRented() - 3) * 1.5;
             break;
       }
    return result;
}

为了让它得以运作,我必须把[租期长度]作为参数传递进去。当然,[租期长度]来自 Rental对象.计算费用时需要两份数据:[租期长度]和[影片类型]。为什么我选择[将租期长度传给Movie对象]而不是[将影片类型传给 Rental对象]呢?因为本系统可能发生的变化是加入新影片类型,这种变化带有不稳定倾向。如果影片类型有所变化,我希望掀起最小的涟漪,所以我选择在 Movie对象内计算费用。

我把上述计费方法放进Movie class里头,然后修改Rental的getCharge(),让它使用这个新函数:
class Rental...
    double getCharge() {
       return _movie.getCharge(_daysRented);
    }

你可能感兴趣的:(最后的重构(1))