###### tags: `CleanCode` <STYLE> p,li,oi,h3{ font-family:"微軟正黑體"; } </STYLE> # 程式碼的氣味和啟發 以下列出氣味不好的程式之因素 #### 開發環境 * 需要多個步驟建立專案或系統:應該利用一個簡單指令就可以取出整個程式。 * 需要多個步驟以進行測試:應該用一個指令就可以完成所有的單元測試(ex:IDE裡按下一個按鈕),追求快速簡單地執行測試。 # #### 一般狀況 * 一個原始檔存在多種程式語言:應盡量將使用的語言減少。 * 明顯該有的行為未被實現:任何函式與類別應該實現符合預期之行為,例如命名。 * 重複的程式碼: ::: info (1) 應將重複的程式碼提取成新方法 (2) 若switch/case和if/else一再地出現,在唯一的switch敘述的多個case中,應用多型的方式取代系統中期於的switch敘述。 (3) 利用TEMPLATE METHOD(模板方法)或是STRATEGY(策略模式)來取代類似演算法沒有共同分享程式碼的狀況。 ::: * 在錯誤抽象層次上的程式碼:高層次概念應放在基底類別,不該知道任何細節的資訊(衍生類別,例如:常數;變數和工具函式)。 * 基底類別相依於衍生類別 * 過多資訊:限制類別中的函式與變數數量、函式中的變數數量。 * 不一致性:**最小驚奇原則**,透過同樣方式來完成類似事件,如命名的一致性。 * 人為的耦合:不應該將常數或函式放在一個臨時方便但不洽當的地方。 * 特色留戀(程式碼氣味的一種):類別的方法應該只能對同一個類別裡的變數和函式感興趣。避免在函式中使用別的類別物件時,對其進行資料存取及修改。 * 不適當的靜態宣告:若要使用static函式,必須確保不會讓該函式有多型的行為。 * 讓邏輯相依變成實體相依:不該有預先假設的情況(即為邏輯相依的一種),利用方法建立來將邏輯相依轉變成實體相依。 * 避免否定的條件判斷,盡量採用肯定判斷。 * 隱藏時序耦合:有些函式的呼叫次序是重要的,建議建立生產線來曝露時序耦合性,讓每個函式都產生下一個函式需要的結果。藉此表示函式的呼叫次序。 --- #### Java * 不要繼承只有常數的interface,改用import方式引入,才能方便辨識來源。 * 若要建立使用enum(列舉)來取代public static final int(宣告類別變數的方式)。 列舉使用方式: ![](https://i.imgur.com/dAiZqXZ.png)