為何曾經流行的匈牙利命名法忽然間銷聲匿跡了


  2022年了,匈牙利命名法的遺毒還在危害人間,是時候徹底摒棄匈牙利命名法了,理由如下:

  1.變量的類型由其含義決定。這是最重要的反對理由。比如money的類型就是money_t,比如object_size的類型就是size_t,事實上size_t是unsigned long的類型別名。類型編碼進變量名,既多余,也無必要,且不能涵蓋所有情況,畫蛇添足。

  2.缺乏一致可解釋性。好的規則應該是一致性可解釋的,它應該能夠在它的問題集內一致性的應用規則,遵從規則只需無腦執行,Do not let me think,匈牙利不滿足,它甚至不能勝任變量命名。

  (a) 比如int的前綴到底是i還是n,char的前綴是c還是ch?那const呢?char* 是str?那const char* x[]呢?pcstra?太啰嗦了。

  (b) C++的模板表示參數化類型,類型是不確定的,怎么加前綴?匈牙利在C語言是難以實施的,在C++是無法實施的。

  (c) MS不僅為基本數據類型定義前綴,還為自定義類型定義前綴,比如h表示句柄,wnd表示窗口,re表示正則,fn表示函數,函數指針pfn?那如果再出現一堆概念,26個字母大概不夠用吧。這么復雜的規則確定能記住?確定對項目有幫助?

  2.修改類型困難。如果把變量類型編碼進變量名,哪天short不夠,改成int,豈不是要把所有s_var全改成i_var?而變量改類型也很常見吧。

  3.冗余,有違精簡原則。好的代碼應該是清晰簡短的,匈牙利命名法聲稱利於閱讀代碼,實際效果恰恰相反。

  (a) 每次見到一個變量,比如puiindex,它遠不如index明晰,我需要在腦海中先過濾掉pui這個無用的前綴,而實際上這個預處理過程完全多余。

  (b) 第一次見到CFont這種類就覺得很奇怪,C是什么?Class首字母嗎?為什么一個類型還要加個前綴?把本來通順的詞搞得那么別扭?

  (c) 軟件強調避免信息冗余,type name已經是一個完整的信息表達式,能准確無誤的表達它的含義,在匈牙利命名中,就變成了type type_name; 很顯然,type的信息冗余了。

  4.業界主流觀點反匈牙利。為什么這么說呢?Top開源項目和Top公司沒有一個還在使用匈牙利命名法(找出一個算我輸),包括STD C庫,C++標准庫STL沒用,說句不好聽的,主張匈牙利命名法可能是開源代碼看的少。

  5.匈牙利命名法是歷史的產物,注定進歷史的垃圾堆。就像GIT替代SVN一樣,技術總在進步,匈牙利出現的時候,我猜想可能是為了彌補IDE的不足,但現在IDE已經進化到鼠標一放上去就能提示變量定義了。

  6.MS已經公開宣稱放棄匈牙利命名法,而且號召大家不再使用。這個已經足夠說服力了,如果它真的那么有效,為什么MS拋棄它?(之前MS推崇經常被挺匈牙利派作為依據,尷尬)

  為什么還有那么多人在堅持匈牙利呢?

  我給出的答案是“慣性的力量”,而這種慣性是不知不覺的,但慣性阻礙進步,而優秀程序員最本質的要求就是好奇和開放,因循守舊,一昧按老規矩辦,甚至失去思辨能力,值得警惕。

  反匈牙利命名法又分溫和派和激進派,無論是溫和派還是激進派,核心觀點都是反匈牙利。

  有個大V在帖子中說:“感覺作者還是顧忌了大家的情緒,說了一些匈牙利的好話…”然后直言不諱的說挺匈牙利的是代碼寫的太少了,導致大家過於關注它的態度,而忽視了它的觀點,但其實,觀點才是重要的,我認為倒不一定是代碼寫的少,開源代碼看的少幾乎是一定的,文章中其他的說的都對。


免責聲明!

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



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