正如我在前面提過的,臨時變量可能是個問題。它們只在自己所屬的函數中有效,所以它們會助長[冗長而復雜]的函數。這里我們有兩個臨時變量,兩者都是用來
從Customer對象相關的Rental對象中獲得某個總量。不論ASCII版或HTML版都需要這些總量。我打算運用Replace Temp with Query(120),并利用所謂的query method來取代totalAmount或frequentRentalPoints這兩個臨時變量。由于class內的任何函數都可以取用(調用)上述所謂query methods,所以它可能夠促進較干凈的設計,而非冗長復雜的函數:
class Customer...
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(); //取得一筆租借記錄
frequentRenterPointers += each.getFrequentRenterPoints();
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;
}
首先我以Customer class的getTotalCharge()取代totalAmount:
class Customer...
public String statement() {
int frequentRenterPoints = 0;
Enumeration rentals = _rentals.elements();
String result = "Rental Record for * " + getName() + "\n";
while(rentals.hasMoreElements()) {
Rental each = (Rental)rentals.nextElement(); //取得一筆租借記錄
frequentRenterPointers += each.getFrequentRenterPoints();
result += "\t" + each.getMovie().getTitle() + "\t" +
String.valueOf(each.getCharge()) + "\n";
}
// add footer lines(結尾打印)
result += "Amount owed is " + String.valueOf(getTotalCharge()) + " \n";
result += "You earned " + String.valueOf(frequentRenterPoints) +
"frequent renter points";
return result;
}
// 譯注:次即query method
private double getTotalCharge() {
double result = 0;
Enumeration rentals = _rentals.elements();
while(rentals.hasMoreElements()) {
Rental each = (Rental)rentals.nextElement();
result += each.getCharge();
}
return result;
}
這并不是Replace Temp with Query(120)的最簡單情況。由于totalAmount在循環內部被賦值,我不得不把循環復制到query method中。