在.NET,舉凡變數、類別、命名空間名稱,若由多個英文字組成(例如:Temp Folder Name),大小寫有兩種規則可遵循:
- Pascal命名法
第一個字母及所有單字的第一個字母都用大寫,如TempFolderName - Camel命名法
第一個字母取小寫,隨後串聯文字的第一個字母採大寫,如tempFolderName
至於何時該用Pascal何時Camel?我的記法是:區域變數、私有欄位屬性,以及方法參數用Camel,其餘用Pascal。
不過有個情況我一直沒搞清楚,當名稱中有一部分是英文縮寫時,該不該全部大寫?例如我有個系統縮寫為AFA,用於命名空間名稱,該叫AFA.Utility,還是Afa.Utility?理由是看過XML寫成System.Xml,也看過UI被寫成System.Web.UI,兩種都有。照理說,命名規則這玩意兒,在開發團隊形成共識然後大家遵循即可,沒有絕對對錯。要命的是,我在兩者間猶豫不決(看心情來著),在斷斷續續開發一段時間後,才赫然發現怎麼專案裡同時有AFA.Utility跟Afa.Security,又有Afa.DAL… 亂到我想巴自己的頭。
痛定思痛,認真查了MSDN文件,依據微軟的.NET命名指南,整理成以下心得:
- 一直以來,我習慣叫多個大寫英文字母組成的名詞為「縮寫」並不夠精確。同樣是數個大寫字母組成,可區分為縮略字(Acronym)及縮寫(Abbreviation)。縮略字由數個單字或片語取第一個字母組成,例如:POC=Proof Of Concept、RFC=Request For Comments;而縮寫是由單字取幾個字母做為代表,例如:ID=Identiication、OK=Okay。(註:縮略字的大小寫規則在.NET 4版MSDN文件有提,.NET 4.5版調整後未納入)
- 只有眾所周知且通用的縮略字,才適合直接用在識別名稱上,例如:HTML、XML。不過「眾所周知且通用」是相對性的,以組件的使用者為範圍,系統代號、自訂的協定名稱,只要你有自信使用組件的相關人員一定懂,就大方用下去吧!
- 為什麼是System.Xml跟System.IO?其實是有規則的,很簡單:兩個字母就全部大寫,兩個以上只有第一個字母大寫。
- 兩個字母的「縮寫」不套用全部大寫規則,如:ID、OK,Pascal時寫Id、Ok,Camel時則為id、ok。
- 兩個字母的縮略字原則都寫大寫,但用於字首又遇上Camel,則都改用小寫,例如:void Process(IOFlag ioFlag)
- 兩個字母以上的縮略字放在字首並採Camel時,也全部改用小寫,例如:void Process(string htmlString)
- 針對複合字(Compound Word),有一些慣例,例如:Callback(不是CallBack)、Email(不是EMail)、UserName(不是Username)、Canceled(不是Cancelled)、Indexes(不是Indice)、LogOn(不用LogIn)、Metadata(不是MetaData)。MSDN文件還列了一些範例,這部分我想開發團隊求一致即可,僅為訂定標準的參考。
- 來個例外搗蛋一下,前面說兩個字母以上的縮略字只留第一個字母大寫,但RSACryptoServiceProvider的RSA全部大寫又是怎麼一回事?
在此奉送豆知識一枚:RSA是三位數學家Ron Rivest、Adi Shamir與Leonard Adleman姓氏的縮寫,寫成Rsa只怕Shamir跟Adleman兩位大師會不開心,那就破例全部大寫吧!
所以,回到我專案的例子:
AFA.Utility應寫成Afa.Utility
Afa.Security是對的
Afa.DAL應改為Afa.Dal
標題的問題,大家應該也有答案了,應該寫LinqHelper。
最後再強調一次:命名規則只求團隊一致,沒有絕對標準,但依循官方建議或業界標準有好處,可縮短新成員的磨合期。
閒聊:剛好昨天就討論提到命名規則,同事說,他前陣子看了微軟開放的原始碼,在裡面看到一堆程式也沒照微軟官方的命名規則來,我說:軟體之所以偉大,並不在於它有依循命名規則… 哈!別誤會我的意思-依循程式規範將讓你的程式碼更偉大,共勉之。