C++編碼規範(2):命名規範
如果你程式碼中的變數名,函式數,類名都取得很好,不僅是個有意義的詞或短語,而且確切的表達了該變數或函式的功能.那讀起程式碼來就像看文章一樣,絕對是一種享受.當然理想是美好的,現實可是殘酷的.很少有人能做到這樣.一來嘛你英語詞彙量得多,不樣不容易找到那麼多合適並貼切的詞.二來就是有些詞組合就會很長,這樣不得不用些縮寫,而縮寫就不是每個人都認識,對一些人來說和無意義的字母沒啥區別,只要你英語好才能一眼瞧出來.
當然當你使用一個程式語言的話,裡面已經弄出很多詞來做關鍵字了,當你看熟了看多了後就會看著很舒服很順眼.但如果你學個啥框架,比如MFC,突然發現那麼多巨集名,還有一些型別名(其實也是巨集轉換整出來的). 就會覺得非常不順眼,非常醜陋.這些型別名大部分是一些縮寫,雖然是代表著確切的意思,但由於縮寫的太厲害了,你跟瞧著一堆沒意義的字母沒啥區別.當然你要用多了看著也就順眼了.
關於命名有兩個比較出名的專業名詞:Hungarian(匈牙利) , Camel(駱駝) , Pascal(帕斯卡)
匈牙利命名法
變數名=屬性+型別+物件描述.
例如int m_iNumber;
如果是區域性變數一般就不需要屬性了,所以就是int iNumber;
1.其中物件描述的名稱都要求有明確含義,可以取物件名字全稱或名字的一部分.可以起自解釋的作用,從名字中就可以看出變數的功能.
2.其中屬性(有個下劃線)包括: g_表示全域性變數, c_表示常量 , m_表示C++類成員變數, s_ 表示靜態變數 , sm_表示靜態成員變數
3.型別部分都是用型別關鍵字的縮寫表示:
型別名 | 縮寫 |
char | c |
short | s |
int | i |
long | l |
unsigned char |
uc |
unsigned short |
us |
unsigned int | ui |
unsigned long | ul |
float | f |
double | d |
long double | ld |
bool | b |
void | v |
pointer | p |
enum | n |
struct | x |
union | w |
array | a |
windows型別 | |
string | sz |
DWORD | dw |
HANDLE | h |
TCHAR | tc |
WCHAR | wc |
smart pointer | sp |
LPSTR | pc |
LPTSTR | ptc |
LPWSTR | pwc |
據說這種命名法是一們叫Charles Simonyi的匈牙利程式設計師發明的,他也在微軟工作過.所以你檢視MFC中的一些原始碼會發現都用的匈牙利命名法,你要是開發中用到MFC可能也傾向於使用這種命名規範.
優點與缺點:
匈牙利命名的優點顯而易見,能從名字本身獲取到很多資訊,知道變數的型別或要實現的功能.
缺點是新增這些字首會使變數名變長,變數名一長就會顯得不雅,另外就是開發人員要多敲幾個字母.當然還有其他很多缺點.
另外就是匈牙利命名主要針對基本型別變數名,但在面嚮物件語言中肯定到處是類名和函式名,那類名和函式名該怎麼取呢? 此時在它們前面加個啥字首沒有太多意義的.
此時變數名=屬性+型別+物件描述 ,中最有物件描述這一項可派得上用場了,但是物件描述可沒給我們帶來啥明確的格式指導,比如描述資訊一長,就很不利於我們眼睛的識別.
於是就需要一些規範應用於物件描述的格式,另外一些命名規範就出現了.
駝峰命名法
駱駝有一個很明顯的特徵就是背像個山峰一樣,有凹下去與凸起來的部分.
於是這種命名法就借鑑了這個特徵,讓變數名通過某些字母大寫來達到凹凸的效果,這有利於眼睛識別,因為如果都是小寫或大寫都不利於眼睛識別.
小駝峰命名法
除第一個單詞首字母小寫,其他單詞首字母大寫.
例如 int myPhoneNumber;
大駝峰命名法(又叫Pascal法)
所以單詞首字母大寫
例如 void GetPhoneNumber();
實際上駝峰命名法與匈牙利命名法並不衝突,有時還可以綜合使用.
匈牙利法是
變數名=屬性+型別+物件描述
我們可以讓前兩者不變,只在物件描述中應用駝峰法.當然了也可以中單獨使用駝峰法,不需要屬性和型別資訊.
在C#中基本上習慣上只使用駝峰法,不再需要屬性或型別的資訊.因為VS這開發環境的智慧感覺支援的非常好,你把滑鼠放哪個變數上會馬上顯示出型別等相關資訊.而且由於C#中在隱式型別轉換時要求較嚴,必須是精度不會降低,不會出現溢位.所以型別資訊對我們用處也不是太大了.最重要的是物件描述的功能性資訊了.
一般函式名和類名都用大駝峰命名法,不過在MFC中類名一般推薦是匈牙利與駝峰結合的變體,類前面加一個大寫的字母C,後面部分就是大駝峰法了
下劃線命名法
就是單詞之間用下劃線連線
比如int MY_NUMBER;
一般用的不多,不過像PL/SQL裡面就用的特別多,因為PL/SQL不像C++和C#變數是區分大小寫的.所以下劃線可能更好點.
在C++中一般巨集都全部大寫,然後單詞間用下劃線分開.