簡介
例子
舉例來說,表單的名稱為form,可以簡寫為frm,則當表單變量名稱為Switchboard時,變量全稱應該為frmSwitchboard。這樣可以很容易從變量名看出Switchboard是一個表單,同樣,如果此變量類型為标簽,那麼就應命名成。
曆史
由Microsoft公司的程序員Charles Simonyi(無疑是個匈牙利人的後裔)提出的。在這種命名法中,變量名或函數名要加上一個或兩個字符的前綴,用來表示變量或函數的數據類型。
舉例
hwnd:h是類型描述,表示句柄,wnd是變量對象描述,表示窗口,所以hwnd表示窗口句柄;
pfnEatApple:pfn是類型描述,表示指向函數的指針,EatApple是變量對象描述,所以它表示指向EatApple函數的函數指針變量。
上面就是HN命名法的一般規則。
反對聲音
命名規範是程序書寫規範中最重要也是最富争議的地方,自古乃兵家必争之地。命名規範有何用?四個字:名正言順。用二分法,命名規範分為好的命名規範和壞的命名規範,也就是說名正言順的命名規範和名不正言不順的命名規範。好的舞鞋是讓舞者感覺不到其存在的舞鞋,壞的舞鞋是讓舞者帶着鐐铐起舞。一個壞的命名規範具有的破壞力比一個好的命名規範具有的創造力要大得多。
成本
匈法的表現形式為給變量名附加上類型名前綴,例如:nFoo,szFoo,pFoo,cpFoo分别表示整型變量,字符串型變量,指針型變量和常指針型變量。可以看出,匈法将變量的類型信息從單一地點(聲明變量處)複制到了多個地點(使用變量處),這是冗餘法。冗餘法的成本之一是要維護副本的一緻性。這個成本在編寫和維護代碼的過程中需要改變變量的類型時付出。冗餘法的成本之二是占用了額外的空間。一個優秀的書寫者會自覺地遵從一個法則:代碼最小組織單位的長度以30個自然行以下為宜,如果超過50行就應該重新組織。一個變量的書寫空間會給這一法則添加不必要的難度。
收益
收益是含糊的,無法預期的。
範本1:strcpy(pstrFoo,pcstrFoo2)Vsstrcpy(foo,foo2)
沒有一個程序員會承認自己不知道strcpy函數的參數類型,所以收益為零。
範本2:unknown_function(nFoo)Vsunknown_function(foo)
收益仍是沒有的。對于一個不知道确定類型的函數,程序員應該去查看該函數的文檔,這是一種成本。使用匈法的唯一好處是看代碼的人知道這個函數要求一個整型參數,這沒有任何用處。函數是一種接口,參數的類型僅僅是接口中的一小部分。諸如函數的功能、出口信息、線程安全性、異常安全性、參數合法性等重要信息還是必須查閱文檔。
範本3:nFoo=nBarVsfoo=bar
使用匈法的唯一好處是看代碼的人知道這裡發生了一個整型變量的複制動作,聽起來沒什麼問題,可以安心了。如果他看到的是nFoo=szBar,就沒辦法放心下來了。但是事情并非如此。首先出現問題的應該是編譯器。另一方面,nFoo=nBar隻是在語法上合法而已,看代碼的人真正關心的是語義的合法性,匈法對此毫無幫助。另一方面,一個優秀的書寫者會自覺地遵從一個法則:代碼最小組織單位中的臨時變量以一兩個為宜,如果超過三個就應該重新組織。結合前述第一個法則,可以得出這樣的結論:易于理解的代碼本身就應該是易于理解的,這是代碼的内建高質量。好的命名規範對内建高質量的助益相當有限,而壞的命名規範對内建高質量的損害比人們想象的要大。
實施
在C語言是難以實施的,在C++語言中是無法實施的。
匈法是類型系統的冗餘,所以實施匈法的關鍵是否能夠精确地對類型系統進行複制。這取決于類型系統的複雜性。
C語言:
1.内置類型:int,char,float,double複制為n,ch,f,d?好像沒有什麼問題。但是void應該怎麼表示,匈法做不到。
2.組合類型:array,union,enum,struct複制為a,u,e,s?并不方便。
這裡的難點不是為主類型取名,而是為副類型取名。an表示整型數組?sfoo,sbar表示結構foo,結構bar?ausfoo表示聯合結構foo數組?非常冗繁。
3.特殊類型:pointer。pointer在理論上應該是組合類型,但是在C語言中可以認為是内置類型,因為C語言并沒有非常嚴格地區分不同的指針類型。
C++語言:
1.class:如果說C語言中的struct還可以用stru搪塞過去的話,不要夢想用cls來搪塞C++中的class。嚴格地講,class根本就并不是一個類型,而是創造類型的工具,在C++中,語言内置類型的數量和class創造的用戶自定義類型的數量相比完全可以忽略不計。stdvectorFoo表示标準庫向量類型變量Foo,是不合乎邏輯的。
2.命名空間:boostfilesystemiteratorFoo,表示boost空間filesystem子空間遍曆目錄類型變量Foo,依舊不可行。
3.模闆:std::map類型的确切名字是什麼,已經超過了255個字符。
有其優點但也有缺點,這就需要在使用中揚長避短,合理應用它。



















