四、重构第三步:提炼"常客积点计算"代码
目的:提取"常客积点计算"代码并放在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;
else
return 1;
}
3、 对getFrequentRenterPoints()"更改方法特征符"为public。
4、 对Customer的函数getFrequentRenterPoints()执行内联操作,重构目标完成。
五、重构第四步:去除临时变量(totalAmount和frequentRenterPoints)
目的:去除临时变量(totalAmount和frequentRenterPoints)
方法:
1、 分析totalAmount和frequentRenterPoints的定义和引用结构如下:
// 声明和定义
double totalAmount = 0;
int frequentRenterPoints = 0;
……
// 在循环中修改
while(rentals.hasMoreElements()){
……
frequentRenterPoints += each.getFrequentRenterPoints();
……
totalAmount += each.getCharge();
……
}
……
// 在循环外使用
result += "Amount owed is " + String.valueOf(totalAmount) + "\n";
result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points";
……
上述两个变量在循环体外面定义和使用,在循环中被修改,运用Replace Temp with Query方法去除这两个临时变量是一项稍微复杂的重构。很遗憾,eclipse目前不支持这样的重构。
2、手工修改代码。
