用的地方替换成直接对getCharge()的引用。选中Customer类的函数amountFor(Rental aRental),在右键菜单中选择"重构/内联",出现参数选择对话框。

选择"确认"按钮,引用amountFor()的地方被替换成对getCharge()的引用。
public String statement() {
……
double thisAmount = each.getCharge();
……
}
4、除去临时变量thisAmount。
选中变量thisAmount,在右键菜单中选择"重构/内联",重构预览窗口如下,可见达到了重构的目的。按下"确认"按钮重构代码。

statement()代码:
public String statement() {
double totalAmount = 0; // 总消费金额
int frequentRenterPoints = 0; // 常客积点
Enumeration rentals = _rentals.elements();
String result = "Rental Record for " + getName() + " ";
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 += " " + each.getMovie().getTitle() + " " +
String.valueOf(each.getCharge()) + " ";
totalAmount += each.getCharge();
}
// add footer lines(结尾打印)
result += "Amount owed is " + String.valueOf(totalAmount) + " ";
result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";
return result;
}
四、重构第三步:提炼"常客积点计算"代码
目的:提取"常客积点计算"代码并放在Rental类中,"常客积点计算"代码如下。
public String statement() {
……
// 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 ++;
……
}
重构后的代码如下:
frequentRenterPoints += each.getFrequentRenterPoints();
重构方法:
Extract Method
Move Method
Change Method signatrue
Inline Method
方法:
1、 首先,抽取代码到独立的函数中。
用"抽取方法"重构代码,函数名:getFrequentRenterPoints。很遗憾,eclipse的不能生成诸如:frequentRenterPoints += getFrequentRenterPoints(Rental aRental); 的代码。原因是执行自增操作的局部变量frequentRenterPoints要出现在等式右边,因此抽取函数getFrequentRenterPoints()一定要把frequentRenterPoints作为参数。手工修改函数和对函数的引用,重构后的代码如下:
public String statement() {
……
while(rentals.hasMoreElements()){
……
frequentRenterPoints += getFrequentRenterPoints(each);
……
}
……
}
/**
* @param each
* @return
*/
private int getFrequentRenterPoints(Rental each) {
if((each.getMovie().getPriceCode())==Movie.NEW_RELEASE && each.getDaysRented()>1)
return 2;
els
上一页 [1] [2] [3] [4] [5] 下一页