在.NET,舉凡變數、類別、命名空間名稱,若由多個英文字組成(例如:Temp Folder Name),大小寫有兩種規則可遵循:

  1. Pascal命名法
    第一個字母及所有單字的第一個字母都用大寫,如TempFolderName
  2. 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命名指南,整理成以下心得:

  1. 一直以來,我習慣叫多個大寫英文字母組成的名詞為「縮寫」並不夠精確。同樣是數個大寫字母組成,可區分為縮略字(Acronym)及縮寫(Abbreviation)。縮略字由數個單字或片語取第一個字母組成,例如:POC=Proof Of Concept、RFC=Request For Comments;而縮寫是由單字取幾個字母做為代表,例如:ID=Identiication、OK=Okay。(註:縮略字的大小寫規則在.NET 4版MSDN文件有提,.NET 4.5版調整後未納入)
  2. 只有眾所周知且通用的縮略字,才適合直接用在識別名稱上,例如:HTML、XML。不過「眾所周知且通用」是相對性的,以組件的使用者為範圍,系統代號、自訂的協定名稱,只要你有自信使用組件的相關人員一定懂,就大方用下去吧!
  3. 為什麼是System.Xml跟System.IO?其實是有規則的,很簡單:兩個字母就全部大寫,兩個以上只有第一個字母大寫。
  4. 兩個字母的「縮寫」不套用全部大寫規則,如:ID、OK,Pascal時寫Id、Ok,Camel時則為id、ok。
  5. 兩個字母的縮略字原則都寫大寫,但用於字首又遇上Camel,則都改用小寫,例如:void Process(IOFlag ioFlag)
  6. 兩個字母以上的縮略字放在字首並採Camel時,也全部改用小寫,例如:void Process(string htmlString)
  7. 針對複合字(Compound Word),有一些慣例,例如:Callback(不是CallBack)、Email(不是EMail)、UserName(不是Username)、Canceled(不是Cancelled)、Indexes(不是Indice)、LogOn(不用LogIn)、Metadata(不是MetaData)。MSDN文件還列了一些範例,這部分我想開發團隊求一致即可,僅為訂定標準的參考。
  8. 來個例外搗蛋一下,前面說兩個字母以上的縮略字只留第一個字母大寫,但RSACryptoServiceProvider的RSA全部大寫又是怎麼一回事?
    在此奉送豆知識一枚:RSA是三位數學家Ron Rivest、Adi Shamir與Leonard Adleman姓氏的縮寫,寫成Rsa只怕Shamir跟Adleman兩位大師會不開心,那就破例全部大寫吧!

所以,回到我專案的例子:
AFA.Utility應寫成Afa.Utility
Afa.Security是對的
Afa.DAL應改為Afa.Dal

標題的問題,大家應該也有答案了,應該寫LinqHelper。

最後再強調一次:命名規則只求團隊一致,沒有絕對標準,但依循官方建議或業界標準有好處,可縮短新成員的磨合期。

閒聊:剛好昨天就討論提到命名規則,同事說,他前陣子看了微軟開放的原始碼,在裡面看到一堆程式也沒照微軟官方的命名規則來,我說:軟體之所以偉大,並不在於它有依循命名規則… 哈!別誤會我的意思-依循程式規範將讓你的程式碼更偉大,共勉之。


Comments

# by

我都看心情...

# by wellxion

開發程式最傷腦的狀況之一就是命名...(趴

# by 天天想你

看完還是不懂 所以,回到我專案的例子: AFA.Utility應寫成Afa.Utility AFA.Security是對的 <---為什麼不寫成 Afa.Security???? Afa.DAL應改為Afa.Dal

# by Jeffrey

to 天天想你, 看不懂是很正常的,因為… 我又打錯字了orz 抱歉 謝謝提醒,已更正本文。

# by

我自己是只有 ClassName 的時候會用 Pascal... 其他因為太懶惰所以都用 Camel 不過我一直很好奇 jQuery 裡面有個 getJSON 為什麼要這樣...

# by ChrisTorng

靠人頭腦記住這些規則很困難,要求大家遵守就更困難。我選擇使用檢查工具幫忙。檢查工具有檢查出來的就遵守,沒有檢查的項目就放著... Visual Studio 內建的程式碼分析工具,其中就有 命名警告 https://msdn.microsoft.com/zh-tw/library/ms182232.aspx 另外 StyleCop 也有 Naming Rules http://www.stylecop.com/docs/Naming%20Rules.html 上文中所提的項目,這兩個工具應該都有涵蓋... 我自己是採取高標準,這兩個工具的所有規則都預設開啟檢查,僅有連我自己都認為難以遵守的才關閉檢查。並設定所有建置都會檢查,要求成員將所有警告都修正。

# by Jeffrey

to ChrisTorng,很棒的實務經驗分享,感謝!

# by franma

黑大,我也是用 工具的 Naming Rule 來檢查的。+1 另外,我的命名方式也是跟你一樣,好開心。

Post a comment