跳到主要內容

[Clean Code]心得之無暇程式碼之戒掉爛名字(poor name)



由於最近上了一門有關Clean code的課程,
所以這邊就簡單地做了一下筆記避免將來忘記
首先是變數的命名
我們一定要謹慎小心地命名, 避免後人維護時看得霧沙沙
以下就簡單舉例什麼是不好的命名(Poor name)

一. MySterious Names

沒辦法一眼看出變數或方法用意的名字
SqlDataReader drl;
int od;
void Button1_click();
class Page1{}
這個例子,我們很難看出宣告drl,od, Button1_click,Page1 到底用意為何
如果將來有個Button2_click那他跟Button1_click的差別又在哪?
我們必須去看實作細節才能知道這些變數\方法的用意
 一般而言,好的名字必須滿足:
  • "Clean"(不拖泥帶水)
  • "Intention-Revealing"(意圖明顯)
如果你的命名需要註解就表示沒有滿足Intention-Revealing
剛剛的範例我們或許可以改成:
SqlDataReader dataReader;
int overdueDays;

void CheckAvailability_Click();
class ViewCustomerPage{}

二. Meaningless Names

沒意義難以理解的名字,
這對於我們去了解這方法一點幫助也沒有 
void BeginCheckfunctionality_StoreClientSideCheckBoxIdsArray();
此時我們還是得去看實作細節才能知道這方法在幹嘛
如果方法的內容很長想必會耗費我們許多寶貴的時間
通常這種方法它可能不只做一件事情
又由於要滿足Intention-revealing並不容易,所以才會出現種名稱
如何改善:
  • 盡量縮短名稱
  • 盡量讓方法內的程式碼小於10行
  • 盡量讓方法只做一件事情
 如此的話就很容易取個meaningful name

三. Names with Encodings

使用匈牙利命名法
 如:
int iMaxRequests;
這裡建議盡量少用匈牙利命名法
早期的C\C++程式開發者由於IDE不發達所以才衍伸出這個方法
但現在的IDE多半都很強,滑鼠移過去就可以直接看到變數值
所以我們沒有必要特別使用匈牙利命名法
以上的例子建議改成  
int maxRequests;
我們再來看使用另一個例子
var m_objCollection = new StringCollection();
這裡我們替某collection用匈牙利命名法命名
但問題是我們仍然很難看出這個collection到底是用來放什麼 
如果這個collection是用來存放顧客名稱
那為何不改成叫做customNames

四. Ambigous Names:

容易誤解的名字
bool MutiSelect(){}
 以上面的例子來說,到底是想表示可以有很多選擇,還是被選了很多!?
 還有,
int? customerNameId;
 這是想表達什麼?是客戶名稱呢還是Id
 如果是客戶名稱的話那為什麼資料型別是整數
 如果是想表達客戶的Id的話,那為什麼可以允許Id是null

最後 Noisy Names

不必要的字 
Customer theCustomer;
List<Customer> listOfApprovedCustomers;
去除不必要的字,讓名稱看起來簡短且易讀 
// good
Customer customer;
List<Customer> approvedCustomers;
結論(若能滿足下列幾點就是個好名字):
  • Not too short, not too long(不要太長也不要太短)
  • Meaningful(有意義)
  • Reveal intention(意圖明顯)



留言