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 lineswitch(each.getMovie().getPriceCode()){case Movie.REGULAR:
thisAmount +=2;if(each.getDaysRented()>2)
thisAmount +=(each.getDaysRented()-2)*1.5;break;case Movie.NEW_RELEASE:
thisAmount += each.getDaysRented()*3;break;case Movie.CHILDRENS:
thisAmount +=1.5;if(each.getDaysRented()>3)
thisAmount +=(each.getDaysRented()-3)*1.5;break;}// 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;}}
statement()方法过于复杂,可以将switch中的代码逻辑提取到一个方法中
选中待提取的代码块
ctrl+alt+m
定义方法名称、参数
检查并修复提取方法后产生的问题
提取方法后的代码
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 each){double thisAmount =0;switch(each.getMovie().getPriceCode()){case Movie.REGULAR:
thisAmount +=2;if(each.getDaysRented()>2)
thisAmount +=(each.getDaysRented()-2)*1.5;break;case Movie.NEW_RELEASE:
thisAmount += each.getDaysRented()*3;break;case Movie.CHILDRENS:
thisAmount +=1.5;if(each.getDaysRented()>3)
thisAmount +=(each.getDaysRented()-3)*1.5;break;}return thisAmount;}}
更改方法中的变量名,使得程序更具表达力
光标移至待命名变量
shift+f6
键入新名称
enter
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;}