轉載: http://blog.csdn.net/lovelion/article/details/9889095
Martin Fowler針對22種代碼味道,提出了相應的重構手段,。具體而言,如下表所示:
代碼味道
常用重構手段
接口不同的相似類(Alternative Classes with Different Interfaces)【異曲同工的類】
● 重命名方法(Rename Method)
● 搬移方法(Move Method)
注釋(Comments)【過多的注釋】
● 抽取方法(Extract Method)
● 引入斷言(Introduce Assertion)
資料類(Data Class)【純稚的資料類】
● 搬移方法(Move Method)
● 封裝字段(Encapsulate Field)
● 封裝集合(Encapsulate Collection)
資料泥團(Data Clump)
● 抽取類(Extract Class)
● 引入參數對象(Introduce Parameter Object)
● 保持對象完整(Preserve Whole Object)
發散式改變(Divergent Change)
● 抽取類(Extract Class)
重複性代碼(Duplicated Code)
● 抽取方法(Extract Method)
● 抽取類(Extract Class)
● 上移方法(Pull Up Method)
● 構模組化闆方法(Form Template Method)
依戀情結(Feature Envy)
● 搬移方法(Move Method)
● 搬移字段(Move Field)
● 抽取方法(Extract Method)
不當的緊密性(Inappropriate Intimacy)【狎昵關系】
● 搬移方法(Move Method)
● 搬移字段(Move Field)
● 将雙向關聯改為單向(Change Bidirectional Association to Unidirectional)
● 将繼承替換成委托(Replace Inheritance with Delegation)
● 隐藏委托(Hide Delegate)
不完備的庫類(Incomplete Library Class)
● 引入外來方法(Introduce Foreign Method)、
● 引入本地擴充(Introduce Local Extension)
過大的類(Large Class)
● 抽取類(Extract Class)
● 抽取子類(Extract Subclass)
● 抽取接口(Extract Interface)
● 将資料值替換為對象(Replace Data Value with Object)
懶惰類(Lazy Class)【冗贅類】
● 内聯類(Inline Class)
● 折疊繼承體系(Collapse Hierarchy)
過長的方法(Long Method)
● 抽取方法(Extract Method)
● 将臨時變量替換為查詢(Replace Temp with Query)
● 将方法替換為方法對象(Replace Method with Method Object)
● 分解條件式(Decompose Conditional)
過長的參數表(Long Parameter List)
● 将參數替換為方法(Replace Parameter with Method)
● 引入參數對象(Introduce Parameter Object)
● 保持對象完整(Preserve Whole Object)
消息鍊(Message Chains)【過渡耦合的消息鍊】
● 隐藏委托(Hide Delegate)
中間人(Middle Man)
● 移除中間人(Remove Middle Man)
● 内聯方法(Inline Method)
● 将委托替換為繼承(Replace Delegation with Inheritance)
并行繼承體系(Parallel Inheritance Hierarchies)
● 搬移方法(Move Method)
● 搬移字段(Move Field)
基本類型困擾(Primitive Obsession)【基本類型偏執】
● 将資料值替換為對象(Replace Data Value with Object)
● 抽取類(Extract Class)
● 引入參數對象(Introduce Parameter Object)
● 将數組替換為對象(Replace Array with Object)
● 将類型碼替換為類(Replace Type Code with Class)
● 将類型碼替換為子類(Replace Type Code with Subclasses)
● 将類型碼替換為狀态/政策(Replace Type Code with State/Strategy)
拒收的遺贈(Refused Bequest)
● 将繼承替換為委托(Replace Inheritance with Delegation)
霰彈式修改(Shotgun Surgery)
● 搬移方法(Move Method)
● 搬移字段(Move Field)
● 内聯類(Inline Class)
過分一般性(Speculative Generality)【誇誇其談的未來性】
● 折疊繼承體系(Collapse Hierarchy)
● 内聯類(Inline Class)
● 移除參數(Remove Parameter)
● 重命名方法(Rename Method)
Switch語句(Switch Statements)【Switch驚悚現身】
● 将條件式替換為多态(Replace Conditional with Polymorphism)
● 将類型碼替換為子類(Replace Type Code with Subclasses)
● 将類型碼替換為狀态/政策(Replace Type Code with State/Strategy)
● 将參數替換為顯式方法(Replace Parameter with Explicit Methods)
● 引入Null對象(Introduce Null Object)
臨時字段(Temporary Field)【令人迷惑的暫時值域】
● 抽取類(Extract Class)
● 引入Null對象(Introduce Null Object)
參考資料:
【作者:劉偉 http://blog.csdn.net/lovelion】