思維導圖
專業術語
重構原則
一、何謂重構?
二、爲何重構 ?
三、重構的難題
代碼的壞味道
一、Duplicate Code
二、Long Method
早期的編程語言中,調用方法需要額外開銷,這使得coder不願意使用small method。但是現代的OO語言幾乎已經完全免除了process內的額外開銷(函數調用)。
三、Large Class
四、Long Parameter
五、Switch Statements
六、 Comments
重新組織你的函數
一、Extract Method
動機:
簡短而有良好命名的函數:——finely grained
1、複用機會大。
2、函數讀起來像讀一系列comments。
3、函數覆寫容易。
重點:函數長度關鍵在於函數名稱和函數本體之間的語義距離。如果提煉動作可以強化代碼的清晰度,那麼就去做。
作法:
1、創建新函數,根據函數的意圖命名——以它“做什麼”命名,而不是以它“怎樣做”命名。
=》 即使Extract Function 非常簡單,例如只是消息或函數調用,只要新Function能夠以更好方式昭示代碼意圖,你也應該提煉它。但如果你想不出更有意義的名稱,就別動它。
2、將Extract的代碼從Source Function 中Move到New Function中。
二、Inline Method
Method Body與Method Name一樣清晰易懂的時候,請Inline Method。
三、Inline Temp
一個臨時變量,只被一個簡單表達式賦值一次,而且賦值完也只使用了一次。——請Inline Temp
四、Replace Temp with Query
如果一個Temp變量,保存一個表達式,將這個表達式Extract Method。——這就是所謂的查詢式,query
動機:
1、局部變量會使代碼難以提煉。
2、臨時變量會驅使你寫出更長的代碼。如果改成query method,那麼class下的method,都可以獲得這份信息。——將編寫出更清晰的代碼。
3、Replace Temp with Query往往是你運用Extract Method之前必不可少的步驟。
作法:
1、找出只被賦值一次的臨時變量。
=> 如果臨時變量賦值超過一次,考慮使用Split Temporary Variable將它分割成多個變量。
2、對Temp Variable賦值的右側部分,Extract到一個獨立函數中。
=> 將Method聲明爲private,日後如果有其他class用的時候再放開它(public或protected)。
如果代碼組織良好,那麼你往往能發現更有效的優化方案。————如果性能真的很糟糕,那麼放回去也很容易。
五、Introduce Explaining Variable
六、Split Temporator Variable
動機:
1、如果臨時變量承擔多個責任,它就應該被替換爲多個臨時變量。每個變量只承擔一個責任。
2、同一個臨時變量承擔兩件不同的事情,會令review變得糊塗。
七、Remove Assignments To Parameters
八、Replace Method with Method Object
大型函數對局部變量的使用無法採用Extract Method。那麼將這個Method放進一個單獨對象中,如此一來,讓局部變量成爲對象的filed,然後在同一個對象中將大型函數分解爲數個小型Method。
動機:
1、將相對獨立的代碼從大型Method中Extract出來,就可以大大提高代碼的可讀性。
2、一個Method中,局部變量氾濫成災,分解這個函數將會非常困難。
3、Replace Method with Method Object 會將所有局部變量變成對象的值域。然後對這個新對象進行Extract Method了。
九、Substitute Algorithm
原文地址:http://www.cnblogs.com/baochuan/archive/2012/03/31/2425441.html