重構-改善既有的代碼設計

What?

   重構(名詞):對軟件內部結構的一種調整,目的是在不改變軟件可觀察行爲的前提下,提升其可理解性,下降其修改爲本。算法

  重構(動詞): 使用一系列重構手法,在不改變軟件可觀察行爲的前提下,調整其結構。編程

 Why?

 1. 重構改進軟件設計數組

2.重構使軟件更容易理解ide

3. 重構提升編程速度函數

When?

1.添加功能 時重構測試

若是你發現本身須要爲程序添加一個特性,而代碼結構使你沒法很方便地達成目的,那就先重構那個程序,使特性的添加比較容易進行,而後再添加特性。spa

2.修補錯誤時重構.net

3.複審代碼時重構設計

 How?

 1. 重構以前,首先檢查本身是否有一套可靠的測試機制。這些測試必須有自我檢測能力。orm

 2. 找 出代碼的邏輯泥團並用Extract Method (Alt + Shift + R) 把它提煉到獨立的函數中。

       2.1 首先找到函數內的局部變量和參數,任何不會被修改的變量均可以被當作參數傳入新的函數,而會被修改的變量就須要格外當心。

       Tips:重構技術就是以微小的步伐修改程序。若是你犯下錯誤,很容易即可發現它。

       2.2 修改難以理解的變量名稱,提升代碼的清晰度。

       2.3 查看代碼段是否放錯了位置。絕大多數狀況下,函數應該放在它所使用的數據的所屬對象內。移動可使用Move Method(Alt + Shift + V)先把代碼複製到新類 調整代碼而後從新編譯。

      2.4 找出程序中對於舊函數的全部引用點,並修改它們,讓它們改用新函數。作完以後,去掉舊函數。進行測試。

        有時候也能夠保留舊函數,讓它調用新函數。若是舊函數是一個public函數,而你又不想修改其餘類的接口,這即是一個有用的手法。

代碼的壞味道

      代碼的壞味道

重構手法

  • 從新組織函數

         Introduce Explaining Variable (引入解釋性變量)

          Split Temporary Variable (分解臨時變量)

          Remove Assignments to Parameters (移除對參數的賦值)

          Replace Method with Method Object (以函數對象取代函數)

          Substitute Algorithm (替換算法)


  • 在對象之間搬移特性

               Move Method(搬移函數)

               Move Field (搬移字段)

               Extract Class (提煉類)

               Inline Class (將類內聯化)

               Hide Delegate (隱藏"委託關係")

               Remove Middle Man (移除中間人)            

               Introduce Foreign Method (引入外加函數)

               Introduce Local Extension (引入本地擴展)

  • 從新組織數據

                Self Encapsulate Field (自封裝字段)                

                Replace Data Value with Object (以對象取代數據值)

                Change Value to Reference (將值對象改成引用對象)

                Change Reference to Value (將引用對象改成值對象)

                Replace Array with Object (以對象取代數組)

                Duplicate Observed Data (複製「被監視數據」)

                Change Unidirectional Association to Bidirectional (將單向關聯改成雙向關聯)

                Change Bidirectional Association to Unidirectional (將雙向關聯改成單向關聯)

                Replace Magic Number with Symbolic Constant (以字面常量取代魔法數)

                Encapsulate Field (封裝字段)

                Encapsulate Collection (封裝集合)

                Replace Record with Data Class (以數據取代記錄)

               Replace Type Code with Class (以類取代類型碼)

               Replace Type Code with Subclasses (以子類取代類型碼)

               Replace Type Code with State/Strategy (以State/Strategy取代類型碼)

               Replace Subclass with Fields (以字段取代子類)

  • 簡化條件表達式

                 Decompose Conditional (分解條件表達式)

                 Consolidate Conditional Expression (合併條件表達式)

                 Consolidate Duplicate Conditional Fragments (合併重複的條件片斷)

                 Remove Control Flag (移除控制標記)

                 Replace Nested Conditional with Guard Clauses (以衛語句取代嵌套條件表達式)

                 Replace Conditional with Polymorphism (以多態取代條件表達式)

                 Introduce Null Object (引入Null對象)

                 Introduce Assertion (引入斷言)

  • 簡化函數調用

         Rename Method (函數更名)

        Add Parameter (添加參數)

        Remove Parameter (移除參數)

        Separate Query from Modifier (將查詢函數和修改函數分離)

        Parameterize Method (令函數攜帶參數)

        Replace Parameter with Explicit Methods (以明確函數取代參數)

        Preserve Whole Object (保持對象完整)

        Replace Parameter with Methods (以函數取代參數)

        Introduce Parameter Object (引入參數對象)

        Remove Setting Method (移除設值函數)

        Hide Method (隱藏函數)

        Replace Constructor with Factory Method (以工廠函數取代構造函數)

        Encapsulate Downcast (封裝向下轉型)

        Replace Error Code with Exception (以異常取代錯誤碼)

        Replace Exception with Test (以測試取代異常)

  • 處理歸納關係

        Pull Up Field (字段上移)

        Pull Up Method (函數上移)

        Pull Up Constructor Body (構造函數本體上移)

        Push Down Method (函數下移)

        Push Down Field (字段下移)

        Extract Subclass (提煉子類)

        Extract Superclass (提煉超類)

        Extract Interface (提煉接口)

        Collapse Hierarchy (摺疊繼承體系)

        Form Template Method (塑造模板函數)

        Replace Inheritance with Delegation (以委託取代繼承)

        Replace Delegation with Inheritance (以繼承取代委託)

相關文章
相關標籤/搜索