跳轉到內容

C++ 程式設計

來自華夏公益教科書,為開放世界提供開放書籍

命名識別符號

[編輯 | 編輯原始碼]

C++ 關於識別符號關鍵字 的命名限制已經在 程式碼部分 中介紹過。這些限制給命名留下了很多自由度,可以使用特定的字首或字尾,名稱以大寫或小寫字母開頭,將所有字母保持在單一大小寫,或者對於複合詞,使用像 "_" 這樣的詞分隔符或翻轉每個元件詞的首字母的大小寫。

注意
還需要注意避免與作業系統 API (取決於可移植性要求) 或其他標準發生衝突。例如,POSIX 的關鍵字以 "_t" 結尾。

匈牙利命名法
[編輯 | 編輯原始碼]

匈牙利命名法,現在也稱為 Apps 匈牙利命名法,是由查爾斯·西蒙尼 (Charles Simonyi) 發明的 (一位在 1972-1981 年間在 Xerox PARC 工作的程式設計師,後來成為微軟首席架構師);並且直到最近,它一直是大多數微軟程式碼中使用的首要命名約定。它使用字首 (比如 "m_" 表示成員變數,"p" 表示指標),而識別符號的其餘部分通常使用某種混合大小寫的方式寫出來。我們提到這個約定,是因為你很可能會發現它正在使用中,如果你在 Windows 中進行任何程式設計,這更可能發生,如果你有興趣瞭解更多,可以檢視 維基百科關於這種命名的條目

這種命名法被認為已經過時,因為它很容易出錯,並且需要一些努力才能在沒有實際好處的情況下維護,而且在當今的 IDE 中也是如此。如今,重構是一項日常任務,IDE 已經發展到可以提供識別符號彈出視窗和顏色方案使用的幫助。所有這些資訊輔助減少了對這種命名的需求。

前導下劃線
[編輯 | 編輯原始碼]

在大多數情況下,最好避免使用前導下劃線。它們是為編譯器或庫的內部變數保留的,並且會使你的程式碼難以移植和維護。這些變數也可以從庫中剝離 (即變數不再可訪問,它對外部世界隱藏),因此除非你想要覆蓋庫的內部變數,否則不要這樣做。

重用現有名稱
[編輯 | 編輯原始碼]

不要使用標準庫函式和物件的名稱作為你的識別符號,因為這些名稱被認為是保留詞,程式在意外使用時可能會變得難以理解。

有意義的名稱
[編輯 | 編輯原始碼]

始終使用良好、未縮寫、拼寫正確、有意義的名稱。

優先使用英語 (因為 C++ 和大多數庫已經使用英語),並避免使用簡短的隱晦名稱。這將使程式碼更容易閱讀和輸入名稱,而無需查詢。

注意
對於迴圈變數和在小範圍內 (~20 行) 使用的變數,可以忽略此規則,如果該變數的目的足夠明顯,可以為它們賦予短名稱以節省空間。歷史上,在這種情況下最常用的變數名稱是 "i"。

"i" 可能來自 "increment" 或 "index" 的單詞。在 for 迴圈中,"i" 非常常見,它完全符合使用這種變數名稱的規範。

在早期的 Fortran 編譯器 (直到 F77) 中,以字母 i 到 n 開頭的變數隱含地表示整數 - 按照慣例,前幾個 (i、j、k) 通常用作迴圈計數器。

名稱表明目的
[編輯 | 編輯原始碼]

識別符號應該表明它所代表的變數/函式/等的函式,例如,foobar 可能不是儲存人的年齡的變數的良好名稱。

識別符號名稱也應該是描述性的。n 可能不是表示員工數量的全域性變數的良好名稱。但是,必須找到長名稱和大量鍵入之間的良好折衷方案。因此,對於在 小範圍或上下文中使用 的變數,可以放寬此規則。許多程式設計師更喜歡使用短變數 (如 i) 作為迴圈迭代器。

大小寫
[編輯 | 編輯原始碼]

按照慣例,變數名稱以小寫字母開頭。在包含多個自然語言詞的識別符號中,使用下劃線或大小寫來分隔這些詞,例如 num_chars (K&R 風格) 或 numChars (Java 風格)。建議你選擇一種符號並不要在一個專案中混合使用。

在命名 #defines、常量變數、enum 常量和宏時,使用全大寫並用 "_" 分隔符;這使得很清楚地表明該值不可更改,並且在宏的情況下,明確地表明你正在使用需要小心處理的構造。

注意
有一種廣泛的觀點認為 LIKE_THIS 這樣的名稱 應該用於宏,這樣宏使用的名稱空間 (不遵守 C++ 範圍) 不會與用於其他識別符號的名稱空間重疊。正如 C++ 命名約定中通常的那樣,沒有一個普遍認可的標準。最重要的是通常保持一致。

函式和成員函式
[編輯 | 編輯原始碼]

賦予函式和成員函式的名稱應該具有描述性,並清楚地表明它所執行的操作。由於函式和成員函式通常執行操作,因此最佳名稱選擇通常包含動詞和名詞的組合,例如 CheckForErrors() 而不是 ErrorCheck(),以及 dump_data_to_file() 而不是 data_file()。函式和成員函式的清晰、描述性的名稱有時可以使正確猜測函式和成員函式的功能變得更容易,從而有助於使程式碼更加自記錄。透過遵循此命名約定和其他命名約定,程式可以更自然地閱讀。

人們在使用包含縮寫詞的名稱時,似乎有不同的直覺。最好確定一種策略,以便名稱是完全可預測的。以 NetworkABCKey 為例。注意 ABC 中的 C 和 key 中的 K 是如何混淆的。有些人並不介意,而另一些人則非常討厭,因此你會在不同的程式碼中發現不同的策略,所以你永遠不知道如何命名某個東西。

字首和字尾有時很有用

  • Min - 表示某事物可以擁有的最小值。
  • Max - 表示某事物可以擁有的最大值。
  • Cnt - 某事物的當前計數。
  • Count - 某事物的當前計數。
  • Num - 某事物的當前數量。
  • Key - 鍵值。
  • Hash - 雜湊值。
  • Size - 某事物的當前大小。
  • Len - 某事物的當前長度。
  • Pos - 某事物的當前位置。
  • Limit - 某事物的當前限制。
  • Is - 查詢某事物是否為真。
  • Not - 查詢某事物是否不為真。
  • Has - 查詢某事物是否具有特定的值、屬性或特性。
  • Can - 用於詢問某件事是否可以做到。
  • Get - 獲取一個值。
  • Set - 設定一個值。

在大多數情況下,最好避免在識別符號開頭使用下劃線。例如,以下識別符號是有效的

  • i 迴圈變數
  • numberOfCharacters 字元數量
  • number_of_chars 字元數量
  • num_chars 字元數量
  • get_number_of_characters() 獲取字元數量
  • get_number_of_chars() 獲取字元數量
  • is_character_limit() 是否達到字元限制?
  • is_char_limit() 是否達到字元限制?
  • character_max() 字元最大數量
  • charMax() 字元最大數量
  • CharMin() 字元最小數量

以下也是有效的識別符號,但你能說出它們的含義嗎?

  • num1
  • do_this()
  • g()
  • hxq

以下識別符號雖然有效,但最好避免使用

  • _num 因為它們可能被編譯器/系統標頭檔案使用
  • num__chars 因為它們可能被編譯器/系統標頭檔案使用
  • main 因為可能會引起混淆
  • cout 因為可能會引起混淆

以下不是有效的識別符號

  • if 因為它是關鍵字
  • 4nums 因為以數字開頭
  • number of characters 因為識別符號中不允許空格

華夏公益教科書