[逼死強迫症 - C&C++設計風格選擇.1] : 命名規範

1.命名規範

  本系列的第一篇,命名風格本就是有關藝術審美,沒有美與醜的絕對標準,本文不免帶有主觀選擇傾向,可是會盡可能保持客觀的態度概括幾種主流的命名風格,僅供參考。制定規範是爲了方便團隊溝通和利於代碼維護,雖然並不能符合每一個藝術家的胃口。對於獨立開發者,花點時間設計本身的編碼風格也是有助於提升能力的,至少能夠在看到本身代碼的時候感受美美噠~~。本文參考了< Google C++ 風格指南>,< Qt 編碼風格>,固然還有維基百科,之後不累述。

1.1.常見命名法

蛇形命名法 [ snake_case]:
  like_this,常見於Linux內核,C++標準庫,Boost以及Ruby,Rust等語言。
駝峯命名法 [ camelCase]:
  likeThis,爲了和帕斯卡命名法區分,本文特指小駝峯式命名法,常見於Qt以及Java。
帕斯卡命名法[ PascalCase]:
  LikeThis,又名大駝峯式命名法,常見於Windows API函數以及C#。
匈牙利命名法[ Hungarian notation]:
  dwWidth,系統匈牙利命名法是被黑的最多的,主要認爲在有類型檢查的語言裏發現類型錯誤編譯器比人更可靠;在有IDE的狀況下,找到一個變量的類型也不是一件難事;一般咱們看到一個陌生的變量的時候,若是不知道它是幹什麼的,知道它的類型好像也並無什麼用;而且在重構的時候,若是你要改變一個變量的類型,儘管其功能並無變,你仍是要去修改變量名。因此除非是Windows系統開發,不建議使用系統匈牙利命名法。
  rwPosition,匈牙利應用命名法不表示變量的類型,而是用前綴表示變量的目的,或者它表明了什麼。這種變量命名方法在幫助程序員理解變量的用途上是頗有幫助的。可是建議前綴不要使用縮寫,除非所用的縮寫是廣泛共識。

1.2.文件命名

文件名後綴:
 1 # C語言不糾結
 2 file.h & file.c
 3 # C++ Group.1(注意C是大寫)
 4 file.h & file.C
 5 # C++ Group.2
 6 file.hh & file.cc
 7 # C++ Group.3
 8 file.hpp & file.cpp
 9 # C++ Group.4
10 file.hxx & file.cxx
tip.1:c語言沒有選擇,如下僅討論c++;
tip.2:各組合能夠混搭,好比常見的file.cpp搭配file.h和Google風格的file.cc搭配file.h;
tip.3:強迫症能夠選擇不混搭的各組,這樣看起來有對稱感;
tip.4:不要選擇第1組大寫C的後綴,特別是在Windows這樣不區分大小寫的操做系統上;
tip.5:一些後綴名可能不被某些較老的編譯器或IDE所默認支持,例如vs2005默認沒有擴展.hh後綴;
tip.6:若是須要跨平臺,推薦選擇第3組,至少boost是這麼選的;
 
文件名命名:
 1 # Teddy項目UserLog文件爲例:
 2 # Group.1
 3 UserLog.c & TedUserLog.c
 4 # Group.2
 5 userlog.c & teduserlog.c
 6 # Group.3
 7 userlog.c & ted_userlog.c
 8 # Group.4
 9 user_log.c & ted_user_log.c
10 # Group.5
11 user-log.c & ted-user-log.c
tip.1:若是須要將源碼直接發佈,可使用項目名作前綴,防止連接時文件名衝突(msvc好像能自動重命名衝突的.obj文件,可是跨平臺程序不能依賴這個特性);
tip.2:各組文件名風格都沒有明顯的缺點,但要注意在區分大小寫的系統上UserLog.c和userlog.c是兩個文件;

1.3.類型命名

 1 /*
 2 ** 基本數據類型的重定義,小寫比首字母大寫更有利於延長Shift壽命,
 3 ** 但也更容易產生命名衝突。
 4 */
 5 typedef unsigned char byte;
 6 typedef unsigned char byte_t;
 7 typedef unsigned char Byte;
 8 typedef unsigned char Byte_t;
 9 
10 /*
11 ** 類與結構體常見的風格是採用PascalCase,不推薦使用camelCase
12 ** 這種怪異的風格。
13 */
14 class HashTable { ...
15 class hash_table { ...
16 struct FileInfo { ...
17 struct file_info { ...
18 
19 /* C語言常見到的風格還有結構體名稱加'_t'後綴 */
20 struct fileinfo_t { ...
21 struct FileInfo_t { ...
22 
23 /* 枚舉命名常見PascalCase風格 */
24 enum FileFlags { ...
25 enum file_flags { ...
tip.1:c語言沒有命名空間,爲防止命名衝突,常見作法是將項目名或其縮寫做爲類型名稱前綴;
tip.2:類,結構體,枚舉的命名風格儘可能保持一致;

1.4.命名空間命名

1 /* 通常使用項目名稱,風格看喜愛。 */
2 namespace my_project { ...
3 namespace MyProject { ...

tip.1:確保命名空間不會和經常使用的庫衝突;c++

1.5.函數和變量命名

 1 /*
 2 ** 在函數和變量命名風格上PascalCase,camelCase,
 3 ** snake_case三足鼎立,選擇憑喜愛。
 4 */
 5 void FunctionName(void) { ...
 6 void functionName(void) { ...
 7 void function_name(void) { ...
 8 
 9 long VarName;
10 long varName;
11 long var_name;
12 
13 /*
14 ** tip.1:snake_case在名稱比較長時可讀性較好;
15 */
16 long variable_names_in_snake_case;
17 long VariableNamesInPascalCase;
18 long variableNamesInCamelCase;
19 
20 /*
21 ** tip.2:PascalCase和camelCase在函數中的區分度較好,
22 ** 在快速掃描代碼邏輯的時候不易被其它符號所幹擾。
23 */
24 long FabonacciFunction(long rabbitNums)
25 {
26     if (rabbitNums < 2) {
27         return rabbitNums;
28     }
29     long resultOne = FabonacciFunction(rabbitNums - 1);
30     long resultTwo = FabonacciFunction(rabbitNums - 2);
31     return resultOne + resultTwo;
32 }
33 
34 long fabonacci_function(long rabbit_nums)
35 {
36     if (rabbit_nums < 2) {
37         return rabbit_nums;
38     }
39     long result_one = fabonacci_function(rabbit_nums - 1);
40     long result_two = fabonacci_function(rabbit_nums - 2);
41     return result_one + result_two;
42 }

tip.3:若是類須要兼容標準庫迭代器或是要支持range for,begin()和end()函數會破壞PascalCase風格的一致性;程序員

1.6.類成員變量和全局變量命名

 1 /*
 2 ** 類成員變量和全局變量的命名風格和局部變量的命名風格
 3 ** 並無更多的區別。惟一的問題是,是否要加前綴或後綴
 4 ** 以方便和局部變量區分開來。
 5 */
 6 class UserInfo {
 7     ...
 8 private:
 9     std::string user_name_; /* Google style */
10     std::string m_userName; /* Hungarian notation */
11     /* 不推薦前綴'_'的風格,可能會和標準庫命名衝突 */
12 };
13 
14 /* 全局變量要少用,推薦加前綴用於區分 */
15 extern "C" long g_commonCount;

tip.1:在有IDE提示時,前綴"m_"的類成員變量可以很快被找到,若是不喜歡這種風格,"this->"一樣也很便利;web

1.7.常量和枚舉值命名

 1 /*
 2 ** 常量和枚舉值的命名風格建議和局部變量的命名風格區分開,
 3 ** 常見的有全字母大寫加'_'的風格,PascalCase風格,以及
 4 ** Google加'k'前綴的風格。
 5 */
 6 static const int DAYS_IN_WEEK = 7;
 7 static const int kDaysInWeek  = 7;
 8 
 9 enum FileOpenMode {
10     ReadOnly, WriteOnly, ReadWrite
11 };
12 
13 enum FileOpenMode {
14     READ_ONLY, WRITE_ONLY, READ_WRITE
15 };

 tip.1:若是可使用c++11特性,推薦enum class,不然能夠在有歧義的枚舉值中重複枚舉類型的名字;ide

1.8.宏命名

 1 /* 宏命名推薦使用全字母大寫加'_'分隔的風格 */
 2 #define OS_UNIX
 3 #define OS_LINUX
 4 #define OS_WINNT
 5 
 6 /* 除非你想用條件編譯將某些功能變爲可選項 */
 7 #ifdef  USE_TCMALLOC
 8 #define my_malloc tcmalloc
 9 #else
10 #define my_malloc malloc
11 #endif

tip.1:能用常量替代宏的地方儘可能使用常量吧;函數

相關文章
相關標籤/搜索