天天看點

代碼重構之壞味道總結

轉載: 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】