??? 如果想要有效的管理一個稍微復雜一點的體系,針對其中事物的一套統一、帶層次結構、清晰明了的命名準則就是必不可少而且非常好用的工具。
??? 活躍在生物學、化學、軍隊、監獄、黑社會、恐怖組織等各個領域內的大量有識先輩們都曾經無數次地以實際行動證明了以上公理的正確性。除了上帝(設它可以改變世間萬物的秩序)以外,相信沒人有實力對它不屑一顧。
??? 在軟件開發這一高度抽象而且十分復雜的活動中,命名規則的重要性更顯得尤為突出。一套定義良好并且完整的、在整個項目中統一使用的命名規范將大大提升源代碼的可讀性和軟件的可維護性。
在引入細節之前,先說明一下命名規范的整體原則:
同一性 | 在編寫一個子模塊或派生類的時候,要遵循其基類或整體模塊的命名風格,保持命名風格在整個模塊中的同一性。
|
標識符組成 | 標識符采用英文單詞或其組合,應當直觀且可以拼讀,可望文知意,用詞應當準確。
|
最小化長度 && 最大化信息量原則 | 在保持一個標識符意思明確的同時,應當盡量縮短其長度。
|
避免過于相似 | 不要出現僅靠大小寫區分的相似的標識符,例如“i”與“I”,“function”與“Function”等等。
|
避免在不同級別的作用域中重名 | 程序中不要出現名字完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會發生語法錯誤,但容易使人誤解。
|
正確命名具有互斥意義的標識符 | 用正確的反義詞組命名具有互斥意義的標識符,如:"nMinValue"和"nMaxValue","GetName()" 和 "SetName()" ....
|
避免名字中出現數字編號 | 盡量避免名字中出現數字編號,如Value1,Value2等,除非邏輯上的確需要編號。這是為了防止程序員偷懶,不肯為命名動腦筋而導致產生無意義的名字(因為用數字編號最省事)。 |
類/結構
除了異常類等個別情況(不希望用戶把該類看作一個普通的、正常的類之情況)外,C++類/結構 的命名應該遵循以下準則:
C++類/結構的命名 | 類的名稱都要以大寫字母“C”開頭,后跟一個或多個單詞。為便于界定,每個單詞的首字母要大寫。
| 推薦的組成形式 | 類的命名推薦用"名詞"或"形容詞+名詞"的形式,例如:"CAnalyzer", "CFastVector" .... |
不同于C++類的概念,傳統的C結構體只是一種將一組數據捆綁在一起的方式。傳統C結構體的命名規則為: 傳統C結構體的命名 | 傳統C結構體的名稱全部由大寫字母組成,單詞間使用下劃線界定,例如:"SERVICE_STATUS", "DRIVER_INFO" .... |
|
函數
函數的命名 | 函數的名稱由一個或多個單詞組成。為便于界定,每個單詞的首字母要大寫。
| 推薦的組成形式 | 函數名應當使用"動詞"或者"動詞+名詞"(動賓詞組)的形式。例如:"GetName()", "SetValue()", "Erase()", "Reserve()" ....
| 保護成員函數 | 保護成員函數的開頭應當加上一個下劃線“_”以示區別,例如:"_SetState()" ....
| 私有成員函數 | 類似地,私有成員函數的開頭應當加上兩個下劃線“__”,例如:"__DestroyImp()" ....
| 虛函數 | 虛函數習慣以“Do”開頭,如:"DoRefresh()", "_DoEncryption()" ....
| 回調和事件處理函數 | 回調和事件處理函數習慣以單詞“On”開頭。例如:"_OnTimer()", "OnExit()" .... |
|
變量
變量應該是程序中使用最多的標識符了,變量的命名規范可能是一套C++命名準則中最重要的部分: 變量的命名 | 變量名由作用域前綴+類型前綴+一個或多個單詞組成。為便于界定,每個單詞的首字母要大寫。
對于某些用途簡單明了的局部變量,也可以使用簡化的方式,如:i, j, k, x, y, z .... | 作用域前綴 | 作用域前綴標明一個變量的可見范圍。作用域可以有如下幾種:
前綴 | 說明 | 無 | 局部變量 | m_ | 類的成員變量(member) | sm_ | 類的靜態成員變量(static member) | s_ | 靜態變量(static) | g_ | 外部全局變量(global) | sg_ | 靜態全局變量(static global) | gg_ | 進程間共享的共享數據段全局變量(global global) |
除非不得已,否則應該盡可能少使用全局變量。 | 類型前綴 | 類型前綴標明一個變量的類型,可以有如下幾種:
前綴 | 說明 | n | 整型和位域變量(number) | e | 枚舉型變量(enumeration) | c | 字符型變量(char) | b | 布爾型變量(bool) | f | 浮點型變量(float) | p | 指針型變量和迭代子(pointer) | pfn | 特別針對指向函數的指針變量和函數對象指針(pointer of function) | g | 數組(grid) | i | 類的實例(instance)
對于經常用到的類,也可以定義一些專門的前綴,如:std::string和std::wstring類的前綴可以定義為"st",std::vector類的前綴可以定義為"v"等等。 |
類型前綴可以組合使用,例如"gc"表示字符數組,"ppn"表示指向整型的指針的指針等等。 | 推薦的組成形式 | 變量的名字應當使用"名詞"或者"形容詞+名詞"。例如:"nCode", "m_nState","nMaxWidth" .... |
|
常量
C++中引入了對常量的支持,常量的命名規則如下: 常量的命名 | 常量名由類型前綴+全大寫字母組成,單詞間通過下劃線來界定,如:cDELIMITER, nMAX_BUFFER ....
類型前綴的定義與變量命名規則中的相同。 |
|
枚舉、聯合、typedef
枚舉、聯合及typedef語句都是定義新類型的簡單手段,它們的命名規則為: 枚舉、聯合、typedef的命名 | 枚舉、聯合、typedef語句生成的類型名由全大寫字母組成,單詞間通過下劃線來界定,如:FAR_PROC, ERROR_TYPE .... |
|
宏、枚舉值
宏、枚舉值的命名 | 宏和枚舉值由全大寫字母組成,單詞間通過下劃線來界定,如:ERROR_UNKNOWN, OP_STOP .... |
|
?