?
http://www.tkk7.com/Files/Wingel/敏捷開發(fā)的必要技巧第1,2章.rar???????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????? 第1章 移除重復(fù)代碼
???????????????????????????????????????????????????????????????????????????????
重復(fù)代碼是怎么產(chǎn)生的?
請觀察下面的代碼,我們已經(jīng)有一個根據(jù)出租記錄的id取出租用客戶的姓名的方法:getCustomerName。
??? public class BookRental { //該類描述出租記錄
??????? String id;
??????? String customerName;
??????? ...
??? }
??? public class BookRentals {
?????? private Vector rentals;
?????? public String getCustomerName(String rentalId) { 根據(jù)出租id取出客戶姓名
?????????? for (int i = 0; i < rentals.size(); i++) {
????????????? BookRental rental = (BookRental) rentals.elementAt(i);
????????????? if (rental.getId().equals(rentalId)) {
????????????????? return rental.getCustomerName();
?????????????? }
?????????? }
?????????? throw new RentalNotFoundException();
??????? }
??? }
??? public class RentalNotFoundException extends Exception {
??????? ...
??? }
假定現(xiàn)在你要增加一個新的方法,該方法是根據(jù)出租記錄的id刪除該記錄,然后把它命名為deleteRental(String rentalId)。現(xiàn)在你已經(jīng)考慮到,就像getCustomerName這個方法一樣,你要一個一個遍歷出租記錄。所以你就將getCustomerName這個方法里面的一些代碼拷出來,然后稍微修改一下:
??
.....
為什么我們要移除重復(fù)代碼?
我來向各位程序員同學(xué)稍微說一下,在BookRentals這個類中,rentals這個屬性的類型是Ventor,如果我們需要將它改為數(shù)組,那我們就必須將所有的"rentals.size()"改為"rentals.length". 在重構(gòu)以后的版本中,我們只需要在getRentalIdxById這個方法中修改一次,而在原來的版本,我們就得在getCustomerName跟deleteRental兩個方法中都改一次。類似的,我們還要將所有的"rentals.elementAt(i)" 改為 "rentals[i]". 又是改一次跟改兩次的比較!
大多數(shù)情況中,如果類似這樣的代碼在10個地方重復(fù),當(dāng)我們修改代碼的時候,就要修改10個地方,我們并不能保證能把這10個地方都記住了,而一旦漏掉了幾個地方,等待我們的,是一處一處的錯誤去修復(fù)。而最致命的是,當(dāng)我們修改的是業(yè)務(wù)邏輯時,這時候,不管我們漏掉了幾個地方,IDE都不會報錯,那么,等待我們的,將一堆去檢查,而造成的一些bug中,很可能是短時間內(nèi)還發(fā)現(xiàn)不了了.慘-_-!!
具體的內(nèi)容在上面的下載鏈接里面的pdf文件里,看pdf比較舒服。http://www.tkk7.com/Files/Wingel/敏捷開發(fā)的必要技巧第1,2章.rar