CleanCode 有意義的命名 - fantasy0107/notes GitHub Wiki
檢查列表
- 有辦法唸出來的名稱 : generationTimestamps
- 名符其實 : $d 和 $elaspedeTimeInDays
- 避免誤導 :
- 有意義的區別 : product/productData/productInfo
- 可被搜尋 : 7 和 MAX_CLASSES_PER_STUDENT
- 避免編碼 : 匈牙利標籤法/成員的字首
- 避免思維轉換 : 讀者應該不需要將你取的名稱重新再想一次
- 類別的命名 : 名詞或名詞片語 ex: Customer, WikiPage
- 方法的命名 : 動詞或棟詞片語 ex: save, deletePage
- 不要裝可愛 : HolyHandGrenade
- 每個概念使用一個詞 : get, fecht, retrieve
- 別說雙關語 : add代表相加和放資料
- 使用解決方法領域的命名 : AccountVisitor
- 使用問題領域的命名 :
- 避免較廣義的字詞 ex: data, info, manager
名符其實
變數,函式或類別要能解答大部分的問題如果一個名稱還需要註解的輔助那麼這就不具備展現意圖的能力
//範例
$d = 10; //消逝的天數
名稱d並沒有解釋任何事情, 它不會讓我們聯想到消逝的天數
//範例
$elaspedeTimeInDays = 10;
$daySinceCreation = 10;
$daysSinceModification = 10;
避免誤導
避開使用與原意圖相違背的字詞
//範例
$hp,$aix,$sco //無法直接從名稱了解意思
$accountList //除非剛好是list型態
$XYZControllerForEfficientHandingOfStrings;
$XYZControllerForEfficientStorageOfStrings;
//名稱太相似
產生有意義的區別
//範例
$product;
$productData;
$productInfo;
//無法區分有啥不同
$customer;
$customerObject;
//無法區分有啥不同
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
//無法區分有啥不同
但是如果可以區分不同的地方那就可以比如
1.a代表區域變數
2.the代表函式參數
使用能唸出來的名稱
//範例
$genymdhms; //錯誤
$generationTimestamp; //正確
使用可被搜尋的名字
使用單一字母和數值常數會有特別的問題
//範例
7和MAX_CLASSES_PER_STUDENT
e和 $examples
//哪個容易被搜尋到?
長命名勝過短命名
命名長度應該與視野一致
避免編碼
匈牙利標籤法
變數名稱裡有資料型態
$phoneString
成員的字首
成員變數前有前置
//範例
//錯誤
class Part
{
private $p_dsc;
...
}
//正確
class Part
{
private $description;
...
}
避免思維的轉換
讀者應該不需要將你取的名稱重新再想一次
類別的命名
名詞或名詞片語
//範例
Customer
WikiPage
Account
AddressParser
方法的命名
動詞或動詞片語
//範例
postPayment
deletePage
save
取出器 -> get
修改器 -> set
判定 -> is
不要裝可愛
賣弄小聰明, 只有懂作者幽默的人, 才會記住這些名稱
//範例
HolyHandGrenade(神聖手榴彈)
wheck(重敲猛擊) 代表 kill
相關筆記
每個概念使用一個詞替抽象概念挑選一個詞並堅持使用它
//範例
//在不同類別的取得方法採用其中一個
fetch, get, retrieve
//程式庫裡使用也用其中一個
controller, manager, driver
別說雙關語
避免使用同一個字詞代表不同意思
比如我們將add代表相加或相連兩個值現在有一個類別方法式將參數放到容器中那麼就會有雙關語的情況
使用解決方案領域的命名
盡量使用電腦科學相關領域術語的命名
//範例
AccountVisitor
JobQueue
使用問題領域的命名
沒有解決方案領域的命名就用該問題領域的術語來命名