1. 程式人生 > >對程式語言中變數命名方法的探討和常用規範

對程式語言中變數命名方法的探討和常用規範

風格優美的程式,讀起來就像讀一篇流暢的文章。清晰易懂又給人以美感。

看著教材和例程中糟糕的編碼風格,再看著同學發來的,模仿那些的拙劣的編碼。我決定寫出這篇文章,談一談我對程式設計規範的拙見。

1.關於變數命名

這個問題是本文準備討論的重點。先來總結一下變數命名的幾大常用方法。

1)匈牙利命名法

匈牙利命名法的特點是字首。用字首標明變數的型別。字首後面的單詞首字母大寫,其他字母小寫。讓人一看到變數名就能知道這個變數的型別。對於類中的成員,在最前面附加使用“m_”字首,意為member。全域性變數新增“g_”字首,意為global。匈牙利命名法出現時間較早。當時的編譯器對型別檢查的能力還比較弱。在現代的編譯器中,編譯器可以發現型別錯誤並給出詳盡而準確的提示資訊。而且匈牙利命名法書寫複雜,因此逐漸退出了歷史舞臺。現在程式設計師使用匈牙利命名法的已經很少了。就連微軟自己了

.Net類庫也放棄了這種命名法。在微軟的技術文件中明確指出,不推薦在.Net程式中使用匈牙利命名法,而推薦使用下面的Camel命名法和Pascal命名法。

但在日常程式設計中,恰當的使用匈牙利命名法也可以帶來方便。例如為控制元件的名稱使用匈牙利命名法,就可以提高程式碼的可讀性。例如儲存按鈕的名字btnSave,密碼輸入框的名字txtPassword,圖片框imgLogo等等。

匈牙利命名法常用的字首有:

int 整形intAge

lng長整型 lngPhoneNum

bln 布林型 blnEmpty

chr 字元型 chrChoice

str 字串型 strName

這些字首還可以再簡化,形成下面的樣子(摘自維基百科):

lAccountNum : 變數是一個長整型 ("l");

arru8NumberList : 變數是一個無符號8位整型陣列 ("arru8");

szName : 變數是一個零結束字串 ("sz")

hwndFoo : 視窗控制代碼

lpszBar : 指向零結束字串的長指標

2Camel命名法

Camel也叫駝峰命名法。顧名思義,就是開頭單詞小寫,後面單詞首字母大寫。這樣兩邊低中間高,看起來像駝峰,因此得名。如果識別符號只有一個單詞,就全部使用小寫。Camel命名法不新增表示型別的字首。在Java的官方標準中,Camel命名法被作為主要命名法。Java的所有庫函式均採用

Camel命名法。在.Net的技術標準中,推薦對變數使用Camel命名法,而對方法名和類名使用下面的Pascal命名法。

Camel命名法的舉例:

getName 返回姓名的函式

setAge 設定年齡的函式

3Pascal命名法

Pascal命名法也是一種受歡迎的命名法。.Net全部類庫的函式名均採用Pascal命名法。Pascal命名法與Camel命名法類似,區別在於其首字母大寫。例如GetDateName等等。

2.變數命名的常見問題

命名法主要側重的還是大小寫的規範。其實更重要的是識別符號本身。使用有意義的名字作為識別符號,這是地球人都知道的真理。但是有意義是什麼意義?怎樣才算有意義?

其實可以總結為一句話,使用英文或常用的英文縮寫,不要使用漢語拼音。絕對不要使用漢語拼音的縮寫。拼音縮寫比用a,b,c來命名還要糟糕。

上次學校培訓資料結構,師兄開啟他的程式碼,有一個函式名是lztz()。我賭你一週內不可能猜出它的含義。你可以先猜一猜。不猜了?好吧我告訴你。這個是“鏈棧退棧”拼音的縮寫。這種函式名是在是令人作嘔!

一些英文的縮寫是可以使用的,下面列出一些常用的英文縮寫:

Send 可縮寫為 Snd;

 Receive 可縮寫為 Rcv

 temp 可縮寫為 Tmp;

 flag 可縮寫為 Flg;

 statistic 可縮寫為 Stat;

 status 可縮寫為 Sta;

 message 可縮寫為 Msg;

下面就來說說幾個常見的問題

Flag,這是很多人都喜歡用的變數名。甚至還出現了flag1,flag2,flag3……不禁讓我想起了賈君鵬你媽喊你回家吃飯,還有賈君鵬他爸,賈君鵬他姑媽……

這種flag雖然是英文,有意義。但並不能表達一個明確的含義。與其使用flag,不如使用isEmpty,canExit,hasNext等更明確的寫法。例如這三個變數名就明確的表示(棧)空,可以退出,(輸入流中)有下一個資料。相信我,is,can,has這三個字首是全世界程式設計師都在使用的字首,是純正的英語。不是我編出來的Chinglish

說到中國式英語,我不禁想到一個有趣的事情,那就是“性別”的英語。應該用Gender,而不是很多人,甚至很多教材上使用的Sex

GetInfo,這個貌似是個不錯的變數名。可以猜到是獲取資訊之意。但是仔細想想,這是廢話,只要有返回值,就肯定是獲取資訊。其實一個get就夠了。這樣的變數可以寫的再詳細一點。比如獲取身份資訊,就是GetID.獲取檔案資訊就是GetFileInfo等等。這樣要比一個單獨的Info有意義很多。類似的還有GetData設定資料,也可以用類似的方法改進。

3.關於縮排

縮排可以讓程式結構清晰。對增強程式可讀性有重要的意義。使用縮排時,推薦使用4個空格來縮排,縮排不要太小,至少要2個空格。使用Tab縮排很方便,但在不同編輯器裡,Tab佔的寬度也是不一樣的。最恐怖的是空格和Tab混用。在Tab4個字元的編輯器裡一切正常,一旦到Tab8字元的編輯器裡,縮排風格就會改變。縮排相當於沒有。大部分編輯器裡都可以設定自動將Tab替換成4個空格,大家可以自己找找這個選項。

縮排也有不同的風格,常見的有以下幾種。

1K&R風格

void using_k_and_r_style(){

    // K&R風格

}

這種風格被Java推薦採用。我個人不是很喜歡。就算寫Java,我也會括號獨佔一行

2)括號獨佔一行

void putting_each_brace_on_its_own_line()

{

    // 括號獨佔一行

}

這個風格我比較喜歡,微軟也採用這種風格的縮排。使用CodeBlocksAstyle外掛以及在VC中使用Alt+F8VC6)或者Ctrl+K,Ctrl+FVS2005之後版本)快捷鍵自動整理程式碼格式,都會採用括號獨佔一行的風格。這也是C++推薦的縮排風格。

3)括號獨佔一行並縮排

奇怪的縮排方法,早期被廣泛使用,現在我沒見過有人用。前段時間看了一本“豪傑超級解霸”作者寫的書,裡面推薦了這種風格。我個人不喜歡這個縮排。

void or_putting_each_brace_on_its_own_line_indented()

   {

   // 括號獨佔一行並縮排

   }

心血來潮,寫了這篇文章。草草收筆,不完善的地方就以後慢慢補充吧。歡迎大家不吝賜教。最後祝大家都能寫出漂亮高效的程式碼。我們共同努力!

原文連結:http://kqwd.blog.163.com/blog/static/412234482010219111453915/