目录
运用Replace Temp with Query除去不必要的局部变量
运用Replace Temp with Query除去不必要的局部变量
重构:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。重构是一种经千锤百炼形成的有条不紊的程序整理方法,可以最大限度地减少整理过程中引入错误的几率。本质上说,重构就是在代码写好之后改进它的设计。
第一个重构案例展示了一个小程序,如何一步一步地将其从结构化程序重构为面向对象程序,使其能够更方便快捷地去修改以满足之后的需求。
实例:影片出租店所用程序,计算每一位顾客地消费金额并打印详单。操作者告诉程序:顾客租了哪些影片、租期多长,程序便根据租赁时间和影片类型算出费用。影片分为三类:普通片、儿童片和新片。除了计算费用,还要为常客计算积分,积分会根据租片种类是否为新片而有不同。
一、重构之前
重构前类图
重构前源程序
Movie.java
public class Movie{
public static final int CHILDRENS = 2;
public static final int REGULAR = 0;
public static final int NEW_RELEASE = 1;
private String _title;
private int _priceCode;
public Movie(String title, int priceCode){
_title = title;
_priceCode = priceCode;
}
public String getTitle() {
return _title;
}
public void setTitle(String _title) {
this._title = _title;
}
public int getPriceCode() {
return _priceCode;
}
public void setPriceCode(int _priceCode) {
this._priceCode = _priceCode;
}
}
Rental.java
class Rental {
private Movie _movie;
private int _daysRented;
public Rental(Movie _movie, int _daysRented) {
this._movie = _movie;
this._daysRented = _daysRented;
}
public Movie getMovie() {
return _movie;
}
public void setMovie(Movie _movie) {
this._movie = _movie;
}
public int getDaysRented() {
return _daysRented;
}
public void setDaysRented(int _daysRented) {
this._daysRented = _daysRented;
}
}
Customer.java
import java.util.Enumeration;
import java.util.Vector;
class Customer {
private String _name;
private Vector _rentals = new Vector();
public Customer(String _name) {
this._name = _name;
}
public void addRental(Rental rental) {
_rentals.addElement(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
switch (each.getMovie().getPriceCode()) {
case Movie.REGULAR:
thisAmount += 2;
if (each.getDaysRented() > 2)
thisAmount += (each.getDaysRented() - 2) * 1.5;