三、重构第二步:搬移"金额计算"代码
目的:
1、 将函数amountFor()转移到Rental类中,并更名为getCharge()。
2、 更新并替换所有对amountFor()的引用。
重构方法:
Move Method
Change Method signatrue
Inline Method
Inline Temp
方法:
1、选中函数amountFor()的定义,在右键菜单中选择"重构/移动",显示参数设置对话框。把新方法名改成getCharge。按下"确定"按钮,Customer Class中的amountFor()函数被移动到Rental Class中,并更名为:getCharge()。

private double amountFor(Rental aRental) {
return aRental.getCharge();
}
/**
* @param this
* @return
*/
private double getCharge() {
……
}


public String statement() {
……
double thisAmount = each.getCharge();
……
}
选中变量thisAmount,在右键菜单中选择"重构/内联",重构预览窗口如下,可见达到了重构的目的。按下"确认"按钮重构代码。

public String statement() {
double totalAmount = 0; // 总消费金额
int frequentRenterPoints = 0; // 常客积点
Enumeration rentals = _rentals.elements();
String result = "Rental Record for " + getName() + "\n";
while(rentals.hasMoreElements()){
Rental each = (Rental)rentals.nextElement(); //取得一笔租借记录
// add frequent renter points(累加 常客积点)
frequentRenterPoints ++;
// add bouns for a two day new release rental
if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE && each.getDaysRented()>1)
frequentRenterPoints ++;
// show figures for this rental(显示此笔租借数据)
result += "\t" + each.getMovie().getTitle() + "\t" +
String.valueOf(each.getCharge()) + "\n";
totalAmount += each.getCharge();
}
// add footer lines(结尾打印)
result += "Amount owed is " + String.valueOf(totalAmount) + "\n";
result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";
return result;
}
