---
# System prepended metadata

title: 程式碼的氣味和啟發
tags: [CleanCode]

---

###### 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)

