最重要的一致性規則是命名管理. 命名風格快速獲知名字代表是什么東東: 類型? 變量? 函數? 常量? 宏 ... ? 甚至不需要去查找類型聲明. 我們大腦中的模式匹配引擎可以非常可靠的處理這些命名規則.
命名規則具有一定隨意性, 但相比按個人喜好命名, 一致性更重, 所以不管你怎么想, 規則總歸是規則.
## 6.1. 通用命名規則
> Tip
> 函數命名, 變量命名, 文件命名應具備描述性; 不要過度縮寫. 類型和變量應該是名詞, 函數名可以用 “命令性” 動詞.
如何命名:盡可能給出描述性的名稱. 不要節約行空間, 讓別人很快理解你的代碼更重要. 好的命名風格:
int num_errors; // Good.
int num_completed_connections; // Good.
糟糕的命名使用含糊的縮寫或隨意的字符:
int n; // Bad - meaningless.
int nerr; // Bad - ambiguous abbreviation.
int n_comp_conns; // Bad - ambiguous abbreviation.
類型和變量名一般為名詞: 如 `FileOpener`, `num_errors`.
函數名通常是指令性的 (確切的說它們應該是命令), 如 `OpenFile()`, `set_num_errors()`. 取值函數是個特例 (在 [函數命名](#) 處詳細闡述), 函數名和它要取值的變量同名.
縮寫:除非該縮寫在其它地方都非常普遍, 否則不要使用. 例如:
// Good
// These show proper names with no abbreviations.
int num_dns_connections; // 大部分人都知道 "DNS" 是啥意思.
int price_count_reader; // OK, price count. 有意義.
Warning
// Bad!
// Abbreviations can be confusing or ambiguous outside a small group.
int wgc_connections; // Only your group knows what this stands for.
int pc_reader; // Lots of things can be abbreviated "pc".
永遠不要用省略字母的縮寫:
int error_count; // Good.
int error_cnt; // Bad.
## 6.2. 文件命名
> Tip
> 文件名要全部小寫, 可以包含下劃線 (`_`) 或連字符 (`-`). 按項目約定來.
可接受的文件命名:
my_useful_class.cc
my-useful-class.cc
myusefulclass.cc
C++ 文件要以 `.cc` 結尾, 頭文件以 `.h` 結尾. 不要使用已經存在于 `/usr/include` 下的文件名 (yospaly 注: 即編譯器搜索系統頭文件的路徑), 如 `db.h`. 通常應盡量讓文件名更加明確. `http_server_logs.h` 就比 `logs.h` 要好. 定義類時文件名一般成對出現, 如 `foo_bar.h` 和 `foo_bar.cc`, 對應于類 `FooBar`. 內聯函數必須放在 `.h` 文件中. 如果內聯函數比較短, 就直接放在 `.h` 中. 如果代碼比較長, 可以放到以 `-inl.h` 結尾的文件中. 對于包含大量內聯代碼的類, 可以使用三個文件: url_table.h // The class declaration.
url_table.cc // The class definition.
url_table-inl.h // Inline functions that include lots of code.
參考 [-inl.h 文件](#) 一節.
## 6.3. 類型命名
> Tip
> 類型名稱的每個單詞首字母均大寫, 不包含下劃線: `MyExcitingClass`, `MyExcitingEnum`.
所有類型命名 —— 類, 結構體, 類型定義 (`typedef`), 枚舉 —— 均使用相同約定. 例如:
// classes and structs
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { ...
// typedefs
typedef hash_map<UrlTableProperties *, string> PropertiesMap;
// enums
enum UrlTableErrors { ...
## 6.4. 變量命名
> Tip
> 變量名一律小寫, 單詞之間用下劃線連接. 類的成員變量以下劃線結尾, 如:
> my_exciting_local_variable
> my_exciting_member_variable_
普通變量命名:
舉例:
string table_name; // OK - uses underscore.
string tablename; // OK - all lowercase.
> Warning
> string tableName; // Bad - mixed case.
結構體變量:結構體的數據成員可以和普通變量一樣, 不用像類那樣接下劃線:
struct UrlTableProperties {
string name;
int num_entries;
}
結構體與類的討論參考 [結構體 vs. 類](#) 一節.
全局變量:對全局變量沒有特別要求, 少用就好, 但如果你要用, 可以用 `g_` 或其它標志作為前綴, 以便更好的區分局部變量.
## 6.5. 常量命名
> Tip
> 在名稱前加 `k`: kDaysInAWeek.
所有編譯時常量, 無論是局部的, 全局的還是類中的, 和其他變量稍微區別一下. `k` 后接大寫字母開頭的單詞::const int kDaysInAWeek = 7;
## 6.6. 函數命名
> Tip
> 常規函數使用大小寫混合, 取值和設值函數則要求與變量名匹配: `MyExcitingFunction()`, `MyExcitingMethod()`, `my_exciting_member_variable()`, `set_my_exciting_member_variable()`.
常規函數:
函數名的每個單詞首字母大寫, 沒有下劃線:
AddTableEntry()
DeleteUrl()
取值和設值函數:取值和設值函數要與存取的變量名匹配. 這兒摘錄一個類, `num_entries_` 是該類的實例變量:
class MyClass {
public:
...
int num_entries() const { return num_entries_; }
void set_num_entries(int num_entries) { num_entries_ = num_entries; }
private:
int num_entries_;
};
其它非常短小的內聯函數名也可以用小寫字母, 例如. 如果你在循環中調用這樣的函數甚至都不用緩存其返回值, 小寫命名就可以接受.
## 6.7. 名字空間命名
> Tip
> 名字空間用小寫字母命名, 并基于項目名稱和目錄結構: `google_awesome_project`.
關于名字空間的討論和如何命名, 參考 [名字空間](#) 一節.
## 6.8. 枚舉命名
> Tip
> 枚舉的命名應當和 [常量](#) 或 [宏](#) 一致: `kEnumName` 或是 `ENUM_NAME`.
單獨的枚舉值應該優先采用 [常量](#) 的命名方式. 但 [宏](#) 方式的命名也可以接受. 枚舉名 `UrlTableErrors` (以及 `AlternateUrlTableErrors`) 是類型, 所以要用大小寫混合的方式.
enum UrlTableErrors {
kOK = 0,
kErrorOutOfMemory,
kErrorMalformedInput,
};
enum AlternateUrlTableErrors {
OK = 0,
OUT_OF_MEMORY = 1,
MALFORMED_INPUT = 2,
};
2009 年 1 月之前, 我們一直建議采用 [宏](#) 的方式命名枚舉值. 由于枚舉值和宏之間的命名沖突, 直接導致了很多問題. 由此, 這里改為優先選擇常量風格的命名方式. 新代碼應該盡可能優先使用常量風格. 但是老代碼沒必要切換到常量風格, 除非宏風格確實會產生編譯期問題.
## 6.9. 宏命名
> Tip
> 你并不打算 [使用宏](#), 對吧? 如果你一定要用, 像這樣命名: `MY_MACRO_THAT_SCARES_SMALL_CHILDREN`.
參考 預處理宏 <preprocessor-macros>; 通常 _不應該_ 使用宏. 如果不得不用, 其命名像枚舉命名一樣全部大寫, 使用下劃線:
#define ROUND(x) ...
#define PI_ROUNDED 3.0
## 6.10. 命名規則的特例
> Tip
> 如果你命名的實體與已有 C/C++ 實體相似, 可參考現有命名策略.
`bigopen()`:函數名, 參照 `open()` 的形式`uint`:`typedef``bigpos`:`struct` 或 `class`, 參照 `pos` 的形式`sparse_hash_map`:STL 相似實體; 參照 STL 命名約定`LONGLONG_MAX`:常量, 如同 `INT_MAX`
- Google 開源項目風格指南 (中文版)
- C++ 風格指南
- 0. 扉頁
- 1. 頭文件
- 2. 作用域
- 3. 類
- 4. 來自 Google 的奇技
- 5. 其他 C++ 特性
- 6. 命名約定
- 7. 注釋
- 8. 格式
- 9. 規則特例
- 10. 結束語
- Objective-C 風格指南
- Google Objective-C Style Guide 中文版
- 留白和格式
- 命名
- 注釋
- Cocoa 和 Objective-C 特性
- Cocoa 模式
- Python 風格指南
- Google Python 風格指南 - 中文版
- 背景
- Python語言規范
- Python風格規范
- 臨別贈言
- JSON 風格指南
- 簡介
- 定義
- 一般準則
- 屬性名準則
- 屬性值準則
- 屬性值數據類型
- JSON結構和保留屬性名
- 頂級保留屬性名稱
- data對象的保留屬性名
- 用于分頁的保留屬性名
- 用于鏈接的保留屬性名
- 錯誤對象中的保留屬性名
- 屬性順序
- 示例
- 附錄