轉載自:http://blog.csdn.net/lovelion/article/details/17970147
2009年,Sean Chambers在其部落格中發表了31 Days of Refactoring: Useful refactoring techniques you have to know系列文章,每天發布一篇,介紹一種重構手段,連續發文31篇,故得名“重構三十一天:你應該掌握的重構手段”。此外,Sean Chambers還將這31篇文章【即31種重構手段】整理成一本電子書, 以下是部落格原文連結和電子書下載地址:
部落格原文:http://lostechies.com/seanchambers/2009/07/31/31-days-of-refactoring/
電子書下載地址:http://lostechies.com/wp-content/uploads/2011/03/31DaysRefactoring.pdf
本系列部落格將基於Sean Chambers的工作,但是更換了程式設計語言(C# --> Java),更重要的是增加了很多新的內容,融入了大量Sunny對這些重構手段的理解,執行個體更加完整,分析也更為深入,此外,還引申出一些新的討論話題,希望能夠協助大家寫出更高品質的程式碼。
這三十一種重構手段羅列如下【註:原文是重構第N天,即Refactoring Day N,Sunny個人覺得有些重構非常簡單,一天一種太少,不過癮,於是重新命名(Rename)為重構第N式,,計劃對這31種重構手段用Java語言重新介紹一遍,介紹次序與原文次序並不完全一致,補充了很多新的內容,】:
Refactoring 1: Encapsulate Collection【重構第一式:封裝集合】
Refactoring 2: Move Method【重構第二式:搬移方法】
Refactoring 3: Pull Up Method【重構第三式:上移方法】
Refactoring 4: Pull Up Field【重構第四式:上移欄位】
Refactoring 5: Push Down Method【重構第五式:下移方法】
Refactoring 6: Push Down Field【重構第六式:下移欄位】
Refactoring 7: Rename(method,class,parameter)【重構第七式:重新命名(方法,類,參數)】
Refactoring 8: Replace Inheritance with Delegation【重構第八式:用委託取代繼承】
Refactoring 9: Extract Interface【重構第九式:提取介面】
Refactoring 10: Extract Method【重構第十式:提取方法】
Refactoring 11: Switch to Strategy【重構第十一式:重構條件陳述式為策略模式】
Refactoring 12: Break Dependencies【重構第十二式:消除依賴】
Refactoring 13: Extract Method Object【重構第十三式:提取方法對象】
Refactoring 14: Break Responsibilities【重構第十四式:分離職責】
Refactoring 15: Remove Duplication【重構第十五式:去除重複代碼】
Refactoring 16: Encapsulate Conditional【重構第十六式:封裝條件運算式】
Refactoring 17: Extract Superclass【重構第十七式:提取父類】
Refactoring 18: Replace exception with conditional【重構第十八式:用條件陳述式取代異常】
Refactoring 19: Extract Factory Class【重構第十九式:提取工廠類】
Refactoring 20: Extract Subclass【重構第二十式:提取子類】
Refactoring 21: Collapse Hierarchy【重構第二十一式:合并繼承階層】
Refactoring 22: Break Method【重構第二十二式:分解方法】
Refactoring 23: Introduce Parameter Object【重構第二十三式:引入參數對象】
Refactoring 24: Remove Arrowhead Antipattern【重構第二十四式:去除複雜的嵌套條件判斷】
Refactoring 25: Introduce Design By Contract checks【重構第二十五式:引入契約式設計驗證】
Refactoring 26: Remove Double Negative【重構第二十六式:消除雙重否定】
Refactoring 27: Remove God Classes【重構第二十七式:去除上帝類】
Refactoring 28: Rename boolean method【重構第二十八式:重新命名布爾方法】
Refactoring 29: Remove Middle Man【重構第二十九式:去除中間人】
Refactoring 30: Return ASAP【重構第三十式:儘快返回】
Refactoring 31: Replace conditional with Polymorphism【重構第三十一式:用多態取代條件陳述式】
在英文原文中提供了C#版的重構執行個體,對重構手段的描述較為精簡,Sunny將這些執行個體都改為了Java版本,並結合個人理解對執行個體代碼和重構描述進行了適當的補充和完善。在本系列文章寫作過程中,參考了麒麟.NET的翻譯版本《31天重構速成 :你必須知道的重構技巧》以及聖殿騎士(Knights Warrior)的《31天重構學習筆記》,在此表示感謝。
----------------------------------------------------------------------------------------------------------------------------------------
重構第一式:封裝集合 (Refactoring 1: Encapsulate Collection)
我們知道,對屬性和方法的封裝可以通過設定它們的可見度來實現,但是對於集合,如何進行封裝呢。
本重構提供了一種向類的使用者(用戶端)隱藏類中集合的方法,既可以讓客戶類能夠訪問到集合中的元素,但是又不讓客戶類直接修改集合的內容,尤其是在原有類的addXXX()方法和removeXXX()方法中還包含一些其他代碼邏輯時,如果將集合暴露給其他所以類,且允許這些類來直接修改集合,將導致在addXXX()方法和removeXXX()方法中新增商務邏輯失效。
下面舉一個例子來加以說明:
【重構執行個體】
電子商務網站通常會有訂單管理功能,使用者可以查看每張訂單(Order)的詳情,也可以根據需要添加和刪除訂單中的訂單項(OrderItem)。因此在Order類中定義了一個集合用於儲存多個OrderItem。
重構之前的程式碼片段如下: [java] view plain copy package sunny.refactoring.one.before; import java.util.Collection; import java.util.ArrayList; //訂單類 class Order { private double orderTotal; //訂單總金額 private Collection<OrderItem> orderItems; //集合對象,儲存一個訂單中的所有訂單項 public Order() { this.orderItems = new ArrayList<OrderItem>(); } //返回訂單項集合 public Collection<OrderItem> getOrderItems() { return this.orderItems; } //返回訂單總金額 public double getOrderTotal() { return this.orderTotal; } //增加訂單項,同時增加訂單總金額