幾種在程式設計中常見的命名風格

在程式設計中,存在大量的命名需求。 我們常常需要為大量的自訂元素命名,小從變數、函式,大至模組、程式庫, 除了「一個東西究竟要叫什麼名字好?」這個問題常常困擾著具有一定素養的程式設計人員外, 「一個名稱該如何呈獻」的問題也常讓程式人員,特別是那些經驗資歷尚淺的人迷惑。

為什麼要有這麼多不同的名稱呈獻方式(風格)?

當我們為一個東西命名,比方說想要給一個變數 “my crazy magic box” 這個名稱, 在程式語言裡我卻不能就直接這樣子寫。 一個名稱往往使用了超過一個的單字組成,然後用空白來分隔它們; 然而空白已經被絕大多數的程式語言用作語法的分隔,再拿來做為識別字的一部份的話, 一定會造成語法解析上的障礙, 所以絕大部分的程式語言並不允許一個識別字裡面含有空白、以及其他一些特殊符號。

因此我們必須另闢蹊徑,使用其他方法來在視覺上區別一個名稱內的個別元素, 既然區別名稱元素的方法不只一個,自然的就造成許多源自不同的發想點而產生的不同名稱方案。 不同名稱方案間的差別通常在於美感、喜好、文化等方面,因此誰也沒能統一誰, 最後人們通常會在他覺得適合的地方使用不同的命名習慣。

常見的命名風格

由於世界上的命名方案之多,我不可能全部列舉解釋, 所以接下來將只介紹一些比較常見而流行的命名風格。

  • Upper Case/Lower Case

    這種命名方案實為兩種相似的方案:

    • Upper Case

      規則:整個名稱全部使用大寫,並且單字間不做任何區隔。
      範例:MYCRAZYMAGICBOX

    • Lower Case

      規則:整個名稱全部使用小寫,並且單字間不做任何區隔。
      範例:mycrezymagicbox

    這種方案的好處是簡單不費事、需要打的字少; 壞處則是單字間少了任何形式的視覺分隔,容易導致一眼看上去不知道在寫什麼? 如果你覺得我上面的範例不足以體現這點的話,請試試這個:grepwithsedandawk

    然而它的缺點也不是嚴重到無法踰越。 對於通常由兩個以下常用單字所組成的名稱中, 熟悉自然語言的人往往可以用極快的速度區別名稱中的單字, 例如 totalsizeusername 等。 因此在實際上,這種命名方式仍被大量使用。

  • Camel Case

    這種命名方案又被細分為兩種子型:

    • Upper Camel Case/Pascal Case

      規則:單字間沒有分隔,每個單字的首字母為大寫、其它為小寫。
      範例:MyCrazyMagicBox

    • Lower Camel Case

      規則:與 Upper Camel Case 相同,但第一個單字的首字母為小寫。
      範例:myCrazyMagicBox

    符合這種規則的名稱在視覺效果上型似駱駝的駝峰,因而得名。

    這些方案的好處是名稱間的單字可以被明顯的識別,並且不會導致名稱變長; 缺點之一是當名稱中含有專有名詞縮寫時可能會導致迷惑和分歧, 例如 “set DB name” 究竟要變成 SetDBName 好?還是 SetDbName 好?

  • Snake Case

    這種命名方案又被細分為兩種子型:

    • Upper Snake Case

      規則:整個名稱全部使用大寫,單字間以底線 “_” 做為區隔。
      範例:MY_CRAZY_MAGIC_BOX

    • Lower Snake Case

      規則:整個名稱全部使用小寫,單字間以底線 “_” 做為區隔。
      範例:my_crezy_magic_box

    符合這種規則的名稱在視覺效果上型似鈕動的蛇,因而得名。 這些方案的好處是名稱間的單字可以被明顯的識別; 缺點是會讓名稱變長,這在程式碼橫幅版面空間有限的條件下很難被忽略!

    實務上,Snake Case 命名方案常常會和 Upper Case 方案或 Lower Case 方案混用, 例如 “set max num” 可能會被表示為 set_maxnum 而不是 set_max_num, 這是因為試圖要節省名稱長度的關係導致。

  • Kebab Case

    規則:整個名稱全部使用小寫,單字間以連字號 “-” 做為區隔。
    範例:my-crazy-magic-box

    符合這種規則的名稱在視覺效果上型似插滿肉的烤肉串,因而得名。

    這種命名方案的大部份特性和 Snake Case 相同, 除了單字間的連字號比起底線在視覺效果上看起來比較不那麼強烈,所以也受人喜愛。 然而大部份的程式語言並不允許連字號(與減號相同)出現在識別字中, 因此 Kebab Case 通常只被使用在各種配置文件、資料字串、 和支援連字號的少部份程式語言的識別字中。

  • Hungarian Notation

    規則:整個名稱比照 Upper Camel Case,然後在名稱前面再加上全部為小寫的型態縮寫。
    範例:bxstMyCrazyMagicBox

    這種命名方式即是惡名昭彰的匈牙利命名法! 看到它在名稱加上型態縮寫,就可以知道這種命名風格是專為程式「變數」而設計, 所以可能難以拿來為函式、類別等變數以外的東西命名。

    雖然當今通常不推薦使用匈牙利命名,但對於這麼有名氣而且現在仍常看見的命名風格, 打著介紹命名風格的文章又怎能不介紹它呢? 有關於匈牙利命名的更多詳細資訊、特別是那些惡形惡狀,請參考我曾發佈的文章:「 為什麼不要使用匈牙利命名法? 」。

Reference