publicclassCustomer{private String name;private Vector _rentals =newVector();publicCustomer(String name){this.name = name;}publicvoidaddRental(Rental rental){
_rentals.add(rental);}public String getName(){return name;}public String statement(){double totalAmount =0;int frequentRenterPoints =0;
Enumeration rentals = _rentals.elements();
String result ="Rental Record for "+getName()+"\n";while(rentals.hasMoreElements()){double thisAmount =0;
Rental each =(Rental) rentals.nextElement();// determine amounts for each line
thisAmount =amountFor(each);// add frequent renter points
frequentRenterPoints ++;// add bonus for a two day new release rentalif((each.getMovie().getPriceCode()== Movie.NEW_RELEASE)&&
each.getDaysRented()>1)
frequentRenterPoints ++;// show figures for this rental
result +="\t"+ each.getMovie().getTitle()+"\t"+
String.valueOf(thisAmount)+"\n";
totalAmount += thisAmount;}// add footer lines
result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";
result +="You earned "+ String.valueOf(frequentRenterPoints)+" frequent renter points";return result;}privatedoubleamountFor(Rental rental){double result =0;switch(rental.getMovie().getPriceCode()){case Movie.REGULAR:
result +=2;if(rental.getDaysRented()>2)
result +=(rental.getDaysRented()-2)*1.5;break;case Movie.NEW_RELEASE:
result += rental.getDaysRented()*3;break;case Movie.CHILDRENS:
result +=1.5;if(rental.getDaysRented()>3)
result +=(rental.getDaysRented()-3)*1.5;break;}return result;}}publicclassRental{private Movie movie;privateint daysRented;publicRental(Movie movie,int daysRented){this.movie = movie;this.daysRented = daysRented;}public Movie getMovie(){return movie;}publicintgetDaysRented(){return daysRented;}}
可以发现,amountFor()方法恰当的位置应该在Rental类中
将光标移动到方法体
f6
选择方法移动的目的类,访问控制范围
适应新家:重命名方法,重新组织代码,使得方法更具表达力
重构后的代码
publicclassCustomer{private String name;private Vector _rentals =newVector();publicCustomer(String name){this.name = name;}publicvoidaddRental(Rental rental){
_rentals.add(rental);}public String getName(){return name;}public String statement(){double totalAmount =0;int frequentRenterPoints =0;
Enumeration rentals = _rentals.elements();
String result ="Rental Record for "+getName()+"\n";while(rentals.hasMoreElements()){double thisAmount =0;
Rental each =(Rental) rentals.nextElement();// determine amounts for each line
thisAmount = each.getCharge();// add frequent renter points
frequentRenterPoints ++;// add bonus for a two day new release rentalif((each.getMovie().getPriceCode()== Movie.NEW_RELEASE)&&
each.getDaysRented()>1)
frequentRenterPoints ++;// show figures for this rental
result +="\t"+ each.getMovie().getTitle()+"\t"+
String.valueOf(thisAmount)+"\n";
totalAmount += thisAmount;}// add footer lines
result +="Amount owed is "+ String.valueOf(totalAmount)+"\n";
result +="You earned "+ String.valueOf(frequentRenterPoints)+" frequent renter points";return result;}}publicclassRental{private Movie movie;privateint daysRented;publicRental(Movie movie,int daysRented){this.movie = movie;this.daysRented = daysRented;}public Movie getMovie(){return movie;}publicintgetDaysRented(){return daysRented;}publicdoublegetCharge(){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;}}