---
# System prepended metadata

title: 第二章 有意義的命名
tags: [Tag(Clean Code)]

---

# 第二章 有意義的命名

###### tags: `Tag(Clean Code)`

## 定義

變數、函式、參數、類別、套件命名，還替程式碼目錄命名，
不斷的在進行命名，需要做如此多命名，如何有良好命名。

### 良好命名規則

#### 良好的習慣：
1. **名稱要能正確表達用意**
    * 能夠透過程式碼了解意圖，傳達想傳達的內容
2. **要避免誤導**
    * 避免用縮寫
    * 避免用關鍵字
    * 避免相似的字，
        * 例如：
            * 使用小寫Ｌ或大寫Ｏ當變數名稱，容易零和1搞混
            * class被用了改用klass來作無意義區別
    * 避免諧音命名 
3. **要使用可以被搜尋的名稱**
4. **要避免思維的轉換**
    * 清楚明白才是王道
5. **類別命名**
    * 應使用名詞
6. **方法命名**
    * 應使用動詞
8. **每個概念使用一種字詞**
9. **使用解決方案領域的命名**
10. **使用問題領域的命名**
11. **添加有意義的上下Context**
    * 函式名稱和演算法提供了上下文，替變數提供清楚的上下文資訊，透過將函式分割成更小的函式，不僅改善了上下文資訊，也使演算法變得整潔。

---

#### 不良的命名習慣

1. **不要裝可愛**
2. **不要使用雙關語**
3. **不要使用特殊編碼**（ex：匈牙利標誌法）
    * 不需使用成員的字首
    * 介面和實作也不需要在字首前加上I
4. **別添加無意義的上下Context**


---


### 範例： 處於含糊上下文資訊中的變數

```
private void printGuessStatistics(char candidate , int count){
    String number;
    String verb;
    String pluralModifier;
    
    if(count == 0 ){
        number = "no";
        verb = "are";
        pluralModifier = "s";
        
    }else if(count == 1 ){ 
        number = "1";
        verb = "is";
        pluralModifier = "";
        
    }else {
        number = Integer.toString(count);
        verb = "are";
        pluralModifier = "s";
    }
    
        String guessMessage = String.format(
            "There %s %s %s%s, verb, number, candidate, pluralModifier");
        
        print(guessMessage);
    }
    
}
```
#### 上述函式問題：

1. 函式有些過長
2. 區域變數幾乎在整個函式中被使用

#### 如何改善：

1. 將函式分割成較小的函式
2. 三個變數變成全域變數

### 範例： 上下文資訊中的變數

```
public class GuessStatisticsMessage{
    private String number;
    private String verb;
    private String pluralModifier;
    
    public String make(char candidate , int count){
        createPluralDependentMessage(count);
        return String.format(
            "There %s %s %s%s, verb, number, candidate, pluralModifier");
    }
    
    
    private void createPluralDependentMessage(int count){
        if(count == 0){
            thereAreNoLetters();
        }else if(count == 1 ){
            thereIsOneLetters();
        }else{
            thereAreManyLetters(count);
        }
        
    }
    
    private void thereAreManyLetters(int count){
        number = Integer.toString(count);
        verb = "are";
        pluralModifier = "s";
    }
    
    private void thereAreNoLetters(){
        number = "no";
        verb = "are";
        pluralModifier = "s";
    
    }
    private void thereIsOneLetters(){
        number = "1";
        verb = "is";
        pluralModifier = "";
    }
    
    
    
    
}
```
