匈牙利命名法,現在被稱為匈牙利應用命名法,由1972年至1981年在施樂帕洛阿爾托研究中心工作的程式設計師查爾斯·西蒙尼發明。此人後來成了微軟的總設計師。
這種命名法其實是對於西蒙尼祖籍的一種諷刺。匈牙利人名和大多數其他歐洲人名相比是反過來的,即姓氏在名字的前面。舉個例子,英語化的名字"Charles Simonyi"在匈牙利語中原本是"Simonyi Károly"。同樣的,在匈牙利命名法中,類型名在實際變數名前,而不是像大多數歐洲的Smalltalk那樣,類型放在變數名後,例如aPoint和lastPoint。後者在西蒙尼任職于施樂帕洛阿爾托研究中心時期非常流行。這種命名法可能也是受到了一種叫做波蘭式的不相關的概念的啟發。
匈牙利命名法這個叫法被許多人記住是因為難發音的輔音字串有點像一些東歐語言中輔音豐富的拼寫方式,儘管實際上匈牙利語是屬於 芬蘭-烏戈爾語族,而不像斯拉夫語族那樣母音豐富。舉例來說,零結束字元串的前綴"sz"實際上就是匈牙利字母表中的一個合體字母(參看德語中的ß)。
系統命名法與應用命名法的區別在於前綴的目的。
在系統匈牙利命名法中,前綴代表了變數的實際數據類型。例如:
lAccountNum : 變數是一個長整型 ("l");
arru8NumberList : 變數是一個無符號8位整型數組 ("arru8");
szName : 變數是一個零結束字元串 ("sz"),這是西蒙尼最開始建議的前綴之一。
匈牙利應用命名法不表示實際數據類型,而是給出了變數目的的提示,或者說它代表了什麼。
rwPosition : 變數代表一個行 ("rw")。
usName : 變數代表一個非安全字元串 ("us"),需要在使用前處理。
strName : 變數代表一個包含名字的字元串("str")但是沒有指明這個字元串是如何實現的。
西蒙尼建議的大多數前綴都是自然語義的,但不是所有。下面幾個是來自原始論文的: [1]
pX是指向另一個X類型的指針,這包含非常少的語義信息。
d是一個前綴表示兩個值的區別,例如,dY可能代表一個圖形沿Y軸的距離,而一個僅僅叫做y的變數可能是一個絕對坐標。這完全是自然語義的。
sz是一個無結束或零結束的字元串。在C中,這包含一些語義信息,因為它不是很明確一個char*類型的變數是一個指向單個字元的指針,還是一個字元數組,亦或是一個零結束字元串。
w標記一個變數是一個字。這基本上沒有包含什麼語義信息,因此大概會被當成是系統命名法。
b標記了一個位元組,和w對比可能有一些語義信息,因為C語言中,只有位元組大小的數據是char型的,因此這些有時候被用來保存數值。這個前綴也許可以明確某個變數保存的是應該被看作是字母(或更一般的字元)的數值還是一個數字。
由於這種命名法通常使用小寫字母開頭用來助記,但是並沒有對助記符本身作規定。有幾種被廣泛使用的習慣(見下面的示例),但是任意字母組合都可以被使用,只要它們在代碼主體中保持一致就可以了。
在使用匈牙利系統命名法的代碼中有時候也可能包含系統匈牙利命名法,即在描述被單獨以類型方式定義的變數時使用。
0 意見:
張貼留言