搬移[金额计算]代码
观察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();
}