從事Windows下C/C++編程的人極可能遇到過相似nCount
、stPerson
這類風格的命名,這類風格的命名方式即爲匈牙利命名法。html
匈牙利命名法(HungarianNotation)是由匈牙利裔美國人Charles Simony發明的,因爲其單詞排列順序相似古怪的匈牙利姓名而得名。編程
實際上Charles Simony發明的是應用型匈牙利命名法,因爲被曲解、以訛傳訛,造成了咱們常見的系統型匈牙利命名法。文章開頭的兩個例子的風格來自於系統型匈牙利命名法。框架
這段歷史在Joel on Software
的《讓錯的程式看得出錯》有詳細的介紹。ide
應用型匈牙利命名法和系統型匈牙利命名法都是經過前綴+對象描述
的形式命名。工具
若 Fahrenheit簡稱爲fah
,Celsius 簡稱爲cel
。下面的代碼咱們一眼就能看出問題:int fahTemp = celThermometer;
由於華氏溫度和攝氏溫度確定不能直接賦值,它們之間有轉換關係,因此代碼邏輯錯誤。ui
int iTemp = iThermometer;
i
標識變量類型是int
,咱們很難看出其中的問題。spa
Windows開發的聖經《Windows 程序設計》初版大量使用了匈牙利命名法,因此係統型匈牙利命名法是Windows開發的事實標準。但隨後的反對也愈演愈烈,在.net第一次發佈時達到了高潮。微軟在.net框架的《通用命名約定》中明確說明不建議使用匈牙利命名法。到如今,除了一些遺產代碼,新的代碼已經鮮見系統型匈牙利命名法了,並且《Windows 程序設計》第六版也不怎麼使用匈牙利命名法了。.net
我認爲其的幾個缺點:設計
圖中是Rust的代碼段,guess
後面的String
是IDE推斷出的,現代的工具已經很發達,能有效避免這種純手工的標註。
其餘語言同理。code
類型不一致致使的問題,在大多數語言的編譯器都會產生錯誤或警告,人工作編譯器的工做,沒有必要。若是出錯,大部分錯誤都是邏輯錯誤,這種類型標註幫不了什麼忙。
該命名法對於C++引入模板容器來講就是災難。引入的容器、迭代器等等不少,單字母已經沒法表示,姑且用vec
表示std::vector
,那該模板類的實例std::vector<int>
怎麼表示?
即便能表示,std::vector<std::vector<std::vector<int>>>
這個又怎麼表示?
世上沒有解決不了的問題,上述的問題確定也是能夠解決的,只要制定相應的規則便可。問題是:這個成本能獲得多大的回報。對於系統匈牙利命名法來講,是沒有必要的。
請關注個人公衆號哦。