# 第二章 有意義的命名 ###### tags: `Tag(Clean Code)` ## 定義 變數、函式、參數、類別、套件命名,還替程式碼目錄命名, 不斷的在進行命名,需要做如此多命名,如何有良好命名。 ### 良好命名規則 #### 良好的習慣: 1. **名稱要能正確表達用意** * 能夠透過程式碼了解意圖,傳達想傳達的內容 2. **要避免誤導** * 避免用縮寫 * 避免用關鍵字 * 避免相似的字, * 例如: * 使用小寫L或大寫O當變數名稱,容易零和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 = ""; } } ```