第一章 重构,第一个案例
2015-03-08 15:00
337 查看
第一章最前面的书中前面的话说得很有道理,一本授之以渔的书,开场就来历史、原理性的东西,很难勾起继续阅读的欲望,写书是这样,开会做分享亦然,所以作者精挑细选了一个代码规模不是很大并且能告诉我们很多重构的道理。
View Code
修改之后类图如下:
好了,重构到现在可以方便地添加以 HTML 展示了,革命尚未成功,如果修改影片的分类规则该怎么做?添加一个新的分类规则就得修改费用计算方式和积分计算方式了,还需继续努力。
案例说明
这是一个非常简单的案例,展示了一个影片出租店用的程序,计算每一位顾客的消费金额并打印详单的模块,同时还需要计算每一位客人的积分。给出一个 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 展示了,革命尚未成功,如果修改影片的分类规则该怎么做?添加一个新的分类规则就得修改费用计算方式和积分计算方式了,还需继续努力。
相关文章推荐
- 第一章:重构,第一个案例(读书笔记系列3)
- 第一章 重构,第一个案例
- 重构-改善既有代码的设计——第一章 重构,第一个案例
- 第一个重构案例——《重构》第一章
- 《重构》读书笔记(二)——第一章 第一个重构案例
- 第一章 重构第一个案例
- 重构第一章 重构的第一个案例
- 第一章:重构,第一个案例(读书笔记系列1)
- 第一章:重构,第一个案例(读书笔记系列2)
- 重构,第一个案例(三)
- 第1章 重构,第一个案例(2):分解并重组statement函数
- 重构改善既有代码的设计--重构第一个案例
- 第1章 重构,第一个案例(3):运用多态取代switch
- 《重构改善既有代码的设计》第一个重构案例
- 重构,第一个案例(三)
- 《重构--改善既有代码的设计》--重构,第一个案例(1)
- 重构,第一个案例(三)
- 重构改善既有代码的设计--重构第一个案例
- 重构,第一个案例(三)
- 重构,第一个案例(三)