搬移[金額計算]代碼
觀察amountFor()時,我發現這個函數使用了來自Rental class的信息,卻沒有使用來自Customer class的信息.
class Customer...
public double amountFor(Rental aRental) {
double result = 0;
switch(aRental.getMovie().getPriceCode()) { //取得影片出租價格
case Movie.REGULAR: //普通片
result+= 2;
if(aRental.getDaysRented() > 2)
result+= (aRental.getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE: //新片
result+= aRental.getDaysRented() * 3;
break;
case Movie.CHILDRENS: //兒童片
result+= 1.5;
if(aRental.getDaysRented() > 3)
result+= (aRental.getDaysRented() - 3) * 1.5;
break;
}
return result;
}
這立刻使我懷疑它是否被放錯了位置.大多數情況下,函數應該放在它使用的數據的所屬object(或說class)內,所以amountFor()應該移
到Rental class去.為了這么做,我要運用Move Method(142).首先把代碼拷貝到Rental
class內,調整代碼使之適應新家,然后重新編譯.下面這樣:
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;
}
這個例子里,[適應新家]意味去掉參數.此外,我還要在搬移的同時變更函數名稱.
現在我可以測試新函數是否正常工作.只要改變Customer.amountFor()函數內容,使它委托(delegate)新函數即可:
class Customer...
private double amountFor(Rental aRental) {
return aRental.getCharge();
}