运用多态(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);
}