這才是真正的“匈牙利命名法”


從剛進大學開始學習 C 語言,就聽說了實際開發中會用到的各種變量命名方法,例如常見的匈牙利命名法、駱駝命名法、Pascal 命名法等。

后來自己真正開始用 C/C++ 寫程序,開始使用匈牙利命名法,總覺得十分別扭。好好的變量名 name,嚴格按照命名規則,非得在前面加類型前綴,改寫成 lpszName。

如今的 IDE 都會自動檢查變量類型,而且類型錯誤在編譯時也比較容易發現,在變量名前面強制加上類型信息實在不知道有什么意義。

 

直到無意中在《More Joel on Software》[1] 這本書第 23 章看到匈牙利命名法作者——Charles Simonyi 的本意。

 

1. 應用型匈牙利命名法——鮮為人知的正統

Simonyi 的匈牙利命名法的原型在微軟公司內部最初被叫做“應用型匈牙利命名法”(Apps Hungarian),因為它是在“應用程序部”(Applications Division)中使用的,也就是用在 Word 和 Excel 身上。在 Excel 的源碼中,你可以看到大量的 rw 和 col 。

使用這種“應用型匈牙利命名法”,我們可以在看到變量后很快理解其含義,並很容易發現代碼中的問題。

例如在代碼中看到 xl = cb,

xl 表示“相對於頁面的橫坐標”,horizontal coordinates relatives to the layout;cb 表示“字節個數”,count of bytes

顯然是有問題的,雖然 xl 和 cb 都是整數,但是這二者之間的賦值基本一定會導致 bug。

 

2. 系統型匈牙利命名法——廣為流傳的冒牌貨

然而,一定程度上由於 Simonyi 自己在編寫文檔時,用了“type”這個詞,而不是“kind”,於是被人誤以為 Simonyi 指的是數據類型。盡管 Simonyi 很詳細、很准確地解釋了他所說的“type”到底是什么意思。可惜於事無補,危害已經釀成了。悲劇的結果就是產生了我們現在熟悉的“系統型匈牙利命名法”(System Hungarian)。

還是上面的例子,改用“系統型匈牙利命名法”以后,可以改成 nWidth = nCount,看起來好像還不錯哈~

bug 就是這樣隱藏起來的。

 

“應用型匈牙利命名法”的前綴是非常有用的、有含義的,比如:

  • “ix” 表示數組的索引值(index)
  • “c” 表示一個計數器(count)
  • “d” 表示兩個數量之間的差(difference),“dx” 就可以表示寬度

 “系統性匈牙利命名法”的前綴就差遠了,比如

  • “l” 表示長整型(long)
  • “ul” 表示無符號長整型(unsigned long)
  • “dw” 表示雙精度值(double word),這實際上也是一個無符號的長整型

這種差別雖然細微,但是完全誤解了 Simonyi 的意圖和做法。“系統型匈牙利命名法”傳播的又遠又廣,在 Windows 編程文檔中,它是標准的變量命名法。難怪很多人都覺得匈牙利命名法很奇怪、很別扭。

 

參考文章:

[1] Joel Spolsky 著,阮一峰 譯,中文名《軟件隨想錄》http://book.douban.com/subject/4163938/

[2] 匈牙利命名法的衰落和建議 http://blog.kingsamchen.com/archives/618#comment-1310

[3] lifeicd讀書筆記


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM