運用多態(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);
}