C++隨筆---命名規則
轉載 : 點選開啟連結
在軟體開發過程中,程式碼的命名規範是一項很突出的內容。一套定義完整、結構清晰明瞭的命名規範將大大提升原始碼的可讀性和軟體的可維護性。
據考證,沒有一種命名規則可以讓所有的程式設計師都滿意,程式設計教科書一般也不會指定命名規則。但是制定一套令開發組成員基本滿意的命名規則,並在專案中貫徹實施,也是團隊開發一項必不可少的工作。
我將我的團隊的實際工作中的命名規則整理如下:
第一部分:共性規則
共有八項。作為指導供成員採納。
【規則1】識別符號應簡單明瞭,望文知意。
標識符采用英文單詞。切忌使用漢語拼音來命名。程式中的英文單詞一般不要太複雜,用詞應當準確。例如不要把CurrentValue寫成NowValue。
儘量不要使用單詞縮寫或首字母縮寫。只有當識別符號過長時才考慮使用單詞縮寫。在使用縮寫時,不要自創縮寫,儘量使用被廣泛接受的縮寫。
【規則2】識別符號長度應當符合“min-length && max-information”原則。
一般的講,長名字能更好地表達含義,所以函式名、變數名、類名長達十幾個字元不足為怪。但是名字也不是越長越好。例如:變數名maxval就比maxValueUntilOverflow更好用。單字元的名字也是有用的,常見的如i,j,k,m,n,x,y,z等,它們通常用作函式內的區域性變數。
【規則3】命名規則儘量與所採用的作業系統或開發工具的風格保持一致。
例如Windows應用程式的識別符號通常採用“大小寫”混排的方式,如AddChild。而Unix應用程式的識別符號通常採用“小寫加下劃線”的方式,如add_child。別把這兩類風格混在一起用。
【規則4】程式中不要出現僅靠大小寫區分的識別符號。
例如:int x和int X;void foo() 和void FOO() 等。
【規則5】避免在不同級別的作用域中重名。
程式中不要出現識別符號完全相同的區域性變數和全域性變數,儘管兩者因作用域的不同而不會發生語法錯誤,但會使人產生誤解。
【規則6】正確命名具有互斥意義的識別符號。
使用正確的反義片語命名具有互斥意義的變數或相反動作的函式。
如:"MinValue"和"MaxValue","GetName()" 和 "SetName()"
【規則7】儘量避免名字中出現數字編號。
如Value1,Value2等,除非邏輯上的確需要編號。這是為了防止程式產生無意義的名字,降低程式的可讀性。
【規則8】使用庫標誌
在開發動態庫時,為了防止軟體庫中的一些識別符號和其它軟體庫中識別符號衝突,可以為各種識別符號加上能反映軟體性質的字首。
例如三維圖形標準OpenGL的所有庫函式均以gl開頭,所有常量(或巨集定義)均以GL開頭。
第二部分:細則
我採用了一部分的“匈牙利”法命名規範,但沒有照搬。“匈牙利”法最大的特徵就是型別字首。例如:
int nNum = 0; // n 為型別資訊,表明 nNum 是一個 int 型別
class CUser; // C 為型別資訊,表明 CUser 是一個類
但是正因為如此,“匈牙利”法命名規範也給人一種繁瑣的感覺。例如:
int i, j, k;
float x, y, z;
倘若採用“匈牙利”命名規則,則應當寫成:
int iI, iJ, ik; // 字首 i表示int型別
float fX, fY, fZ; // 字首 f表示float型別
對於此類情況,我的處理方式是不加型別字首。而對於下列情況我會加:
int iHeigh;
Bool bFlag;
總之,在我的命名規範中,型別字首是一個可選的命名規則。下面分類進行詳細的規範。
一、 類和介面
1、 命名:類名都以大寫字母“C”開頭,後跟一個或多個單詞。每個單詞的首字母要大寫。介面以大寫"I"開頭,代表Interface。
2、 組成形式:推薦用"名詞"或"形容詞+名詞"的形式,例如:"CAnalyzer", "CFastVector" ....
二、 函式
1、 命名:函式的名稱由一個或多個單片語成。每個單詞的首字母要大寫。最長不得超過20個字元。
2、 組成形式:全域性函式應當使用"動詞"或者"動詞+名詞"(動賓片語)的形式。例如:"gGetName()", " gDrawBox()"。
類成員函式應當只使用“動詞”,被省略掉的名詞就是物件本身。例如:
" box->Draw();"。
3、 全域性函式:以小寫字首"g"開頭。
4、 保護成員函式:開頭應當加上一個下劃線“_”以示區別,例如:"_SetState()"
5、 私有成員函式:開頭應當加上兩個下劃線“__”,例如:"__DestroyImp()"
6、 虛擬函式:習慣以“Do”開頭,如:"DoRefresh()", "_DoEncryption()"
7、 回撥和事件處理函式 :習慣以單詞“On”開頭。例如:"_OnTimer()", "OnExit()"
三、 變數
變數是程式中使用最多的識別符號,變數的命名規範是一套C++命名規範中最重要的部分:
1、 命名:變數名由作用域字首+型別字首+一個或多個單片語成。變數用小寫字母開頭的單詞組合而成,第二個單詞的首字母要大寫。例如:int nDrawMode。變數最長不得超過20個字元。
特殊的:對於某些用途簡單明瞭的區域性變數,也可以使用簡化的方式,如:i, j, k, x, y, z
2、 組成形式:變數的名字應當使用"名詞"或者"形容詞+名詞"。例如:"nCode", "m_nState","nMaxWidth"," oldValue "," newValue "。
3、 作用域字首:作用域字首標明一個變數的可見範圍。作用域可以有如下幾種:
字首 |
說明 |
例子 |
無 |
區域性變數 |
|
m_ |
類的成員變數(member) |
Int m_width |
ms_ |
類的靜態成員變數(static member) |
static int ms_initValue; |
s_ |
靜態變數(static) |
static int s_initValue; |
g_ |
外部全域性變數(global) |
int g_howManyPeople; |
sg_ |
靜態全域性變數(static global) |
|
gg_ |
程序間共享的共享資料段全域性變數(global global) |
|
說明:作用域字首不同於下面的型別字首,應該堅決執行。原因是:
1)變數作用域和連結性改變的情況是很少的,例如,很少的情況下會把一個成員變數改成靜態變數
2)程式設計中使用的工具常常不會直觀的顯示變數的作用域和連結性
4、 型別字首:作用域字首標明一個變數的可見範圍。型別字首標明一個變數的型別,有如下幾種:
字首 |
說明 |
例子 |
b |
布林型變數(bool, BOOL) |
bEnable |
ch |
字元型變數(char TCHAR) |
chName |
lpsz |
LPSTR、LPCSTR、LPCTSTR |
lpszName |
n |
整型和位域變數(int, UINT,__int32,__int64) |
nLength |
l |
long |
lOffset |
by |
BYTE |
|
w |
WORD |
wPos |
dw |
DWORD |
dwRange |
f |
浮點型變數(float) |
|
d |
double |
|
p |
指標型變數和迭代子(pointer) |
pDoc |
lp |
遠指標 |
|
e |
列舉型變數(enumeration) |
|
pfn |
特別針對指向函式的指標變數和函式物件指標(pointer of function) |
|
g |
陣列(grid) |
|
h |
handle Windows物件控制代碼 |
hWnd |
四、 常量
常量名由型別字首+全大寫字母組成,單詞間通過下劃線來界定,如:cDELIMITER, nMAX_BUFFER。型別字首的定義與變數命名規則中的相同。
五、 結構體、巨集、列舉變數、聯合體
全部由字首+大寫字母組成,單詞間使用下劃線界定。
1、 結構體:加小寫字首"tag",之後以大寫字母開頭。
例:
typedef struct tagPOINT
{
int x;
int y;
} POINT;
2、 巨集:大寫字母組成,單詞間使用下劃線界定
例:#define MAXNUMBER 100
3、 列舉變數:加小寫字首"enum"。
例:
typedef enum _FILE_OPEN_MODE
{
OPEN_READONLY,
OPEN_READWRITE
}FILE_OPEN_MODE;
4、 聯合體:加小寫字首"uni"。
例:
typedef union _VARIANT
{
char unichVal;
int uninVal;
float uniftVal;
} VARIANT;