重構學習(一)

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

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

 

重構的優勢:性能優化

  • 改進軟件設計
  • 使軟件更容易理解
  • 幫助找到bug
  • 提升編程速度

 

重構應該隨時隨地進行,事不過三,三則重構:框架

  • 添加功能時重構
  • 修補錯誤時重構
  • 複審代碼時重構

 

重構的難題:函數

  1. 數據庫:常常會遇到數據庫與應用緊耦合,非面向對象型數據庫能夠添加分隔層,如使用Hibernate之類的ORM框架;面向對象型數據庫
  2. 修改接口:對於已發佈接口修改是,應保留老接口,是老接口調用新接口,儘可能減小發布接口

 

一個項目開始時候應該考慮好各個模塊的靈活性,但實現這種靈活性每每會須要花更多時間,並增長代碼的複雜度,同時並非全部模塊的靈活性都有用,因此在時間有限時考慮好經過重構將代碼變得靈活的難度,若是不難能夠先作非靈活實現,當有須要時在重構。性能

 

重構和性能:優化

    重構是代碼更易於維護理解的同時,每每會犧牲性能。若是在一個性能要求極高的系統中,應該以性能爲優先;對於大多數程序進行分析,會發現它吧大半時間都耗費在一小半代碼上,一視同仁的性能優化,90%的努力都是收效甚微的,因此這時能夠考慮,這90%的代碼用重構得到代碼的可讀性優先。設計

    

代碼的壞味道對象

  • Duplicated Code(重複代碼):Extract Method抽出重複代碼,放在合適的地方
  • Long Methods(過長函數):分解函數,遵循原則:每當感受須要以註釋來講明點什麼的時候,咱們就把須要說明的東西寫進一個獨立函數中,並以其用途命名,可能用到Extract Method;
    • 若是有大量的臨時變量,能夠用Inline Temp和Replace  Temp With Query;
    • 用過參數過長,能夠用Introduce Parameter Object和Preserve Whole Object;
    • 當臨時變量的使用使你沒法採用Extract Method可使用Replace Method with Method Object;
    • 當條件語句過長,循環邏輯難以理解,也應該考慮提出單獨的函數,能夠用Decompose Conditional
  • Large Class(過大的類):想利用單個類作太多的事情,內部每每就會出現太多實例變量;
    • 可使用Extract Class將幾個變量一塊兒提煉到新類中
    • 若是提出的類適合做爲一個子類,可使用Extract Subclass

 

重構手法:接口

  1. Extract Method(提煉方法):將一段代碼放進一個獨立函數,函數名以用途命名
  2. Inline Method(內聯函數):當某個方法只有一行,並且很好理解時,能夠提出方法體直接使用
  3. Inline Temp(內聯臨時變量):將對臨時變量的應用,替換成複製給臨時變量的表達式
  4. Replace Temp With Query(以查詢取代臨時變量):降臨時變量提出稱爲一個方法返回值
  5. Introduce Parameter Object(引入參數對象):以一個對象取代大量參數
  6. Preserve Whole Object(保持對象完整):當參數都是某對象的屬性時,改成傳遞對象自己
  7. Replace Method with Method Object(以函數對象取代函數):將這個函數放進一個單獨對象中,如此一來局部變量就成了對象內的字段。而後能夠在同一個對象內將大型函數分解成多個小型函數
  8. Decompose Conditional(分解條件表達式):從if-then-else中分別提出獨立的函數
  9. Extract Class(提煉類):創建一個新類,將相關的字段和函數從舊類搬移到新類
  10. Extract Subclass(提煉子類):創建一個子類,將相關的字段和函數從父類搬移到子類
相關文章
相關標籤/搜索