星期五, 12月 08, 2006

我的寫碼風格與技巧(一):變數命名

筆者認為程式是寫給人看的,不是寫給電腦看的,一個好的程式大致上應該有:
  • 變數與常數命名規則清楚
  • 結構控制良好且容易閱讀
  • 註解詳細與文件說明完整
  • 錯誤與例外處理完善
變數與常數命名規則
  • 常數應該是全部大寫,並以底線分字。
  • 變數可採用小寫加底線,亦可採用匈牙利命名法之大小寫分字。
  • 資料庫表名、欄名應全部寫小寫,並以底線分字。
  • 變數應在程式碼開始之前宣告並註解其義。
  • 拋棄式變數,如迴圈用的 i,應該在要使用之前宣告。
常數多半是全部大寫,並以底線分字,這是來自於C語言的慣例,如 WM_PAINT,然而在某些語言中並不一定遵循這種慣例,像 Java 中常見到 final int constNum; 這種寫法,筆者的習慣是凡常數者一律大寫,並用底線來分字。

變數的命名規則一向很少探討到,以筆者常年來的經驗所見,常見的變數命名規則大概有幾種:
  • 傳統C和Unix系統上的加底線如:my_char
  • C++等物件導向語言興起後的大小寫如:myChar
  • 自創規則,如VBB裡的不分大小寫亦不用底線:thisismychar
  • 莫名奇妙的編碼,如國內某大軟體公司的資料庫中常見:A1, A2, A3...
其中第一種通則是最常使用的,也是筆者建議的,筆者知道有許多人使用大小寫區分的通則,但此法有缺點存在,請看下面的程式:

Class CMyClass {

public:

int getValue;
void getValue();

private:

// ...statement...

};

這是最常見的C++物件宣告寫法,一般我們的物件和成員函式(Member Functions)都會用這種方式,但是資料成員(Data Members)如果還是用同樣的方式來命名,那當我們要使用時,碰到兩者同名就很容易搞混了,所以筆者不贊成對變數使用和成員函式相同的命名規則,而是建議對變數採用傳統加底線方式,對成員函式才使用大小寫,僅管如此,我們還是常見到同時採用兩種作法的程式碼,此外,一般變數應該是名詞,函式應該是動詞加名詞,所以上面那段程式其實是不良的範例,只是為了突顯出同名的可能性而已,這種寫法最早是來自於匈牙利命名法,如果要使用這種變數命名方式,建議同時使用匈牙利命名法以避開可能會產生的錯誤。


匈牙利(Hungarian)命名法:

您應該有聽過所謂的「匈牙利命名法」,這是為了紀念微軟的一位傳奇性程式設計師 Charles Simonyi。在 Windows 程式上面您將會大量的看到此種命名法,這種方式是變數名以一個或者多個小寫字母開始,這些字母表示變數的『種類』。如 hInstance 中的h字首表示代碼(Handle),lpszClassName 則是表示長整數的指標指向一個以零結尾的字串(Long Pointer String end by Zero),但是很多人沒搞清楚種類和型別是不同的,所以常會寫出這種程式:

char *pchInput;

像這樣若不參照前後程式碼,吾人無法判斷出這是一個字元指標或是字串指標,也因此許多人就開始批評匈牙利命名法是多此一舉,其實是沒搞清楚匈牙利命名法真正的含義。

匈牙利命名法關聯閱讀:

http://chinesetrad.joelonsoftware.com/Articles/Wrong.html


Programming Windows by Charles Petzold (Microsoft Press)

Writing Solid Code by Steve Maguire (Microsoft Press)


此外,某些資料庫有大小寫相容性的問題,建議只用英文小寫和底線來建立資料表和欄位名稱。


其實變數的命名通則其實是很自由的,要如何做是您自己的選擇,筆者不能保證筆者的見解是最好的,只要您與您的團隊能夠遵循同一個標準就夠了。

沒有留言: