您的位置:首页 > 其它

第一章 重构,第一个案例

2015-03-08 15:00 337 查看
第一章最前面的书中前面的话说得很有道理,一本授之以渔的书,开场就来历史、原理性的东西,很难勾起继续阅读的欲望,写书是这样,开会做分享亦然,所以作者精挑细选了一个代码规模不是很大并且能告诉我们很多重构的道理。

案例说明

这是一个非常简单的案例,展示了一个影片出租店用的程序,计算每一位顾客的消费金额并打印详单的模块,同时还需要计算每一位客人的积分。给出一个 UML 图,是最初版本。

public class Customer {
...
public String statement() {
Enumeration<Rental> rentalEnumeration = rentals.elements();
String result = "Rental Records for " + getName() + "\n";

while (rentalEnumeration.hasMoreElements()) {
Rental each = rentalEnumeration.nextElement();
// show figures for this rental
result += "\t" + each.getMovie().getTitle() + "\t" + each.getCharge() + "\n";
}

// add footer lines
result += "Amount owed is " + getTotalCharge() + "\n";
result += "You earned " + getTotalFrequentRenterPointers() + " frequent renter points";
return result;
}

public String htmlStatement() {
Enumeration<Rental> rentalEnumeration = rentals.elements();
String result = "<h1>Rental Records for " + getName() + "</h1>\n";
result += "<table border='1'><tr><td>Movie Name</td><td>Charge</tr>\n";
while (rentalEnumeration.hasMoreElements()) {
Rental each = rentalEnumeration.nextElement();
// show figures for this rental
result += "\t<tr><td>" + each.getMovie().getTitle() + "</td><td>" + each.getCharge() + "</td></tr>\n";
}

// add footer lines
result += "\t<tr><td colspan='2'>Total Charge:" + getTotalCharge() + "</td></tr>\n";
result += "\t<tr><td colspan='2'>Total Pointers:" + getTotalFrequentRenterPointers() + "</td></tr>\n";
result += "</table>";
return result;
}

private double getTotalCharge() {
double result = 0;
Enumeration<Rental> rentalEnumeration = rentals.elements();
while (rentalEnumeration.hasMoreElements()) {
result += rentalEnumeration.nextElement().getCharge();
}
return result;
}

private double getTotalFrequentRenterPointers() {
double result = 0;
Enumeration<Rental> rentalEnumeration = rentals.elements();
while (rentalEnumeration.hasMoreElements()) {
result += rentalEnumeration.nextElement().getFrequentRenterPointers();
}
return result;
}

}

public class MainClass {
...
public static void main(String[] args) {
// 三部影片
Movie movie1 = new Movie("复仇者联盟", Movie.NEW_RELEASE);
Movie movie2 = new Movie("超能陆战队", Movie.CHILDREN);
Movie movie3 = new Movie("澳门风云", Movie.REGULAR);

//两名顾客
Customer customer1 = new Customer("Jack");
Customer customer2 = new Customer("Stary");

//顾客租约
Rental rental1 = new Rental(movie1, 5);
Rental rental2 = new Rental(movie2, 3);
Rental rental3 = new Rental(movie3, 3);
customer1.addRentals(rental1);
customer1.addRentals(rental2);
customer2.addRentals(rental2);
customer2.addRentals(rental3);

System.out.println("---------Console 形式展示--------------");
System.out.println(customer1.statement());
System.out.println("-----------------------");
System.out.println(customer2.statement());

System.out.println("----------HTML 形式展示-------------");
System.out.println(customer1.htmlStatement());
System.out.println(customer2.htmlStatement());

}
}


View Code

修改之后类图如下:



好了,重构到现在可以方便地添加以 HTML 展示了,革命尚未成功,如果修改影片的分类规则该怎么做?添加一个新的分类规则就得修改费用计算方式和积分计算方式了,还需继续努力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: