從剛進大學開始學習 c 語言,就聽說了實際開發中會用到的各種變數命名方法,例如常見的匈牙利命名法、駱駝命名法、pascal 命名法等。
後來自己真正開始用 c/c++ 寫程式,開始使用匈牙利命名法,總覺得十分彆扭。好好的變數名 name,嚴格按照命名規則,非得在前面加型別字首,改寫成 lpszname。
如今的 ide 都會自動檢查變數型別,而且型別錯誤在編譯時也比較容易發現,在變數名前面強制加上型別資訊實在不知道有什麼意義。
直到無意中在《more joel on software》[1] 這本書第 23 章看到匈牙利命名法作者——charles simonyi 的本意。
使用這種「應用型匈牙利命名法」,我們可以在看到變數後很快理解其含義,並很容易發現**中的問題。
例如在**中看到 xl = cb,
xl 表示「相對於頁面的橫座標」,horizontal coordinates relatives to the layout;cb 表示「位元組個數」,count of bytes顯然是有問題的,雖然 xl 和 cb 都是整數,但是這二者之間的賦值基本一定會導致 bug。
然而,一定程度上由於 simonyi 自己在編寫文件時,用了「type」這個詞,而不是「kind」,於是被人誤以為 simonyi 指的是資料型別。儘管 simonyi 很詳細、很準確地解釋了他所說的「type」到底是什麼意思。可惜於事無補,危害已經釀成了。悲劇的結果就是產生了我們現在熟悉的「系統型匈牙利命名法」(system hungarian)。還是上面的例子,改用「系統型匈牙利命名法」以後,可以改成 nwidth = ncount,看起來好像還不錯哈~
bug 就是這樣隱藏起來的。
「應用型匈牙利命名法」的字首是非常有用的、有含義的,比如:
「系統性匈牙利命名法」的字首就差遠了,比如
這種差別雖然細微,但是完全誤解了 simonyi 的意圖和做法。「系統型匈牙利命名法」傳播的又遠又廣,在 windows 程式設計文件中,它是標準的變數命名法。難怪很多人都覺得匈牙利命名法很奇怪、很彆扭。
匈牙利命名法
匈牙利命名法 匈牙利命名法是一種程式設計時的命名規範。基本原則是 變數名 屬性 型別 物件描述,其中每一物件的名稱都要求有明確含義,可以取物件名字全稱或名字的一部分。命名要基於容易記憶容易理解的原則。保證名字的連貫性是非常重要的。舉例來說,表單的名稱為form,那麼在匈牙利命名法中可以簡寫為frm,...
匈牙利命名法
匈牙利命名法是一種程式設計時的命名規範。基本原則是 變數名 屬性 型別 物件描述,其中每一物件的名稱都要求有明確含義,可以取物件名字全稱或名字的一部分。命名要基於容易記憶容易理解的原則。保證名字的連貫性是非常重要的。舉例來說,表單的名稱為form,那麼在匈牙利命名法中可以簡寫為frm,則當表單變數名...
匈牙利命名法
匈牙利命名法 匈牙利命名法是一種程式設計時的命名規範。基本原則是 變數名 屬性 型別 物件描述,其中每一物件的名稱都要求有明確含義,可以取物件名字全稱或名字的一部分。命名要基於容易記憶容易理解的原則。保證名字的連貫性是非常重要的。舉例來說,表單的名稱為form,那麼在匈牙利命名法中可以簡寫為frm,...