《重構》讀書筆記

wenbochang發表於2021-03-06

程式碼的壞味道

  • 當你感覺需要攥寫註釋的時候,請先嚐試重構,試著讓註釋變得多餘。
  • 重複程式碼(Duplicated Code)
同一個類的兩個函式有相同的表示式
 
兩個互為兄弟的子類內含相同的表示式 ==> 提解到超類中去
 
兩個毫不相關的類出現重複程式碼 ==> 放到第三個類,用一個靜態方法,或者放入其中一個類,另一個類呼叫它即可,看具體詳情

 

  • 過長的函式(Long Method)
每當感覺需要以註釋來說明點什麼的時候,我們就把需要說明的東西寫進一個獨立函式中並以其用途(而非實現手法)來命名。
 
如果函式內有大量的引數和臨時變數,他們會對你的函式提煉形成阻礙。傳遞臨時變數給新函式,導致可讀性是非常的差的。此時你可以 把臨時變數放到子函式中去,最終需要的變數,return回來即可
 
條件表示式和迴圈也是提煉的訊號。 都可以提煉到一個獨立函式中,並且以良好的命名來說明用途

 

  • 過大的類 (Large Class)
如果單個類做的事情太多,類內有太多的程式碼,也是程式碼重複,混亂並最終走向死亡的源頭。
 
按照職責拆分類。比如,先確定客戶端如何使用他們,然後清除了解這個類,在進行分解

 

  • 過長的引數列 (Long Parameter List)
太長的引數會造成前後不一致,不易使用,而且難以理解
 
此時,你需要把過長的引數封裝到一個物件中去,這樣就十分的方便了
 
此物件一般叫做VO,或者xxxxRequest 看個人

 

重新組織函式

  • 提煉函式 (Extract Method)
如果一個函式非常的長,那麼把其中邏輯一樣的部分提煉出來。比如
一個簡單的迴圈列印並且計算sum的函式
 
printTest();
int res = getRes();
 
但對於有臨時變數的,這個是特別的注意。傳參,還有返回值,這十分的謹慎琢磨。

 

  • 引用解釋性變數 (Introduce Explaining Variable)
你可以用這項重構將每個條件子句提煉出來,以一個良好的命名的臨時變數來解釋對應條件子句的意義
 
總感覺可用可不用

 

  • 移除對引數的賦值 (Remove Assignments to Parameters)
程式碼對一個引數(傳進一個函式的引數)賦值,是非常不友好的做法。
 
所以請以一個臨時變數取代該引數的位置

 

  • 以函式物件取代函式 (Replace Method with Method Object)
如果一個函式之中區域性變數氾濫成災,那麼想分解這個函式是非常困難的,有時你會發現根本無法拆解一個需要拆解的函式。這種情況,你就需要函式物件這件法寶了。
 
將這個函式變為物件,函式的區域性變數變為函式物件的欄位。在新類裡面建立一個 compute 的函式,然後使用分解函式進行重構即可

 

重新組織資料

  • 以物件取代資料值 (Replace Data Value with Object)
比如:一開始你可能會用一個字串來表示 “電話號碼” 的概念,但是隨後你就會發現,電話號碼需要 “格式化”, “抽取區號” 之類的特殊行為。
 
對這個 “電話號碼” 你有很多的操作,這是非常不友好的。
 
所以必要時,將 String phone ==> Phone phone 一個物件

 

 

 

相關文章