從新組織函數(函數相關的重構手法)算法
1.Extract Method(提煉函數)(過長的函數或者須要註釋才能讓人理解用途的代碼,那麼就該提煉出來放到一個獨立的函數裏面)函數
作法:spa
1.創造一個新函數,根據這個函數的意圖來命名對象
2.把提煉出來的代碼拷貝到新函數裏面it
3.仔細檢查提煉出來的代碼,看看其中是否引用了「做用於限制於原函數」的變量,包括局部變量和原函數參數變量
4.檢查是否有「僅做用於被提煉代碼段的臨時變量,若是有 那麼在目標函數中申明爲臨時變量」重構
5.吧被提煉代碼中須要讀取的臨時變量,當作參數傳給目標函數循環
6.在原函數中,被提煉出來的代碼段 替換爲 對目標函數的調用引用
7.檢查被提煉代碼段,是否有個局部變量被修改了,若是被修改了看看是否能夠處理爲一個查詢,若是不能,那麼就不能原封不動的提煉代碼了,參考Split Temporary Variable 而後在提煉,或者用Replace Temp With Query 吧臨時變量消滅,再提煉程序
2. Inline Method(內聯函數)(有一種狀況是該函數沒有必要成爲一個獨立的函數,還有一種狀況是若是委託太多,有時候就須要內聯了)
作法:
1.肯定不具有多態性,找出全部的調用者,把函數被替換爲內聯
3.Inline Temp(內聯臨時變量)(有些臨時變量是多餘的,那麼刪掉吧)
4.Replace Temp With Query(用查詢替代臨時變量,程序用一個臨時變量來保存某一表達式的結果,吧這個表達式提煉到一個獨立的函數中再把全部表達式 替換爲函數的調用,此後新函數就能夠被其餘使用,,,臨時變量的問題在於,只在該函數可見 ,這會驅使你寫更長的代碼,若是替換爲查詢,那麼狀況會好得多)
作法:
找出只被賦值一次的臨時變量(C++ 可用const來確認),而後提煉出函數,再用inline temp來處理臨時變量
5.Introduce Explaining Variable(引入解釋性變量)(把複雜的表達式或者其中一部分的結果放進一個臨時變量,以此變量名稱來解釋表達式的用途,來增長可讀性)
6.Split Temporary Variable(分解臨時變量)(某個臨時變量被賦值超過一次,它既不是循環變量也不用於收集計算結果,那麼就該針對每次賦值,建立一個獨立,對應的臨時變量。保證一個臨時變量值承擔一個責任)
7.Remove Assignments to Parameters(移除對參數的賦值)(注意傳值和轉地址的區別)
8.Replace Method with Method Object(以函數對象取代函數)(若是一個大型函數沒法用Extract Method 那麼就能夠吧這個函數放進一個單獨的對象,如此一來局部變量就成了對象內的字段,而後在這個類中拆分這個大型函數)
8.Substitute Algorithm(替換算法)(吧每一個算法替換爲一個更清晰的算法,如:函數內部大量的if 若是能夠用查詢 循環來替換,那就替換吧)