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