程式碼的壞味道
-
當你感覺需要攥寫註釋的時候,請先嚐試重構,試著讓註釋變得多餘。
-
重複程式碼(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 一個物件