1. 程式人生 > >Google C++Style Guide【C++程式設計風格指南解讀】——命名約定

Google C++Style Guide【C++程式設計風格指南解讀】——命名約定

       最重要的一致性規則是命名管理. 命名風格快速獲知名字代表是什麼東東: 型別? 變數? 函式? 常量? 巨集 ... ? 甚至不需要去查詢型別宣告. 我們大腦中的模式匹配引擎可以非常可靠的處理這些命名規則.

命名規則具有一定隨意性, 但相比按個人喜好命名, 一致性更重要, 所以不管你怎麼想, 規則總歸是規則.

1:函式命名,變數命名,檔案命名要有描述性;少用縮寫
解讀:儘可能給有描述性的命名,別心疼空間,畢竟讓程式碼易於新讀者理解很重要。不要用只有專案開發者能理解的縮寫,也不要通過砍掉幾個字母來縮寫單詞。

int price_count_reader;    // 無縮寫
int num_errors;            // “num” 本來就很常見
int num_dns_connections;   // 人人都知道 “DNS” 是啥


2:檔名要全部小寫, 可以包含下劃線 (_) 或連字元 (-). 按專案約定來. 如果並沒有專案約定,”_” 更好

解讀:通常應儘量讓檔名更加明確

* my_useful_class.cc
* my-useful-class.cc
* myusefulclass.cc


3:型別名稱的每個單詞首字母均大寫, 不包含下劃線: MyExcitingClass, MyExcitingEnum.

解讀:型別包含類、列舉、結構體等等....

// classes and structs
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { ...

// typedefs
typedef hash_map<UrlTableProperties *, string> PropertiesMap;

// enums
enum UrlTableErrors { ...


4:變數名一律小寫, 單詞之間用下劃線連線. 類的成員變數以下劃線結尾, 但結構體的就不用,如:: a_local_variable, a_struct_data_member, a_class_data_member_.

解讀:注意類的成員變數以下劃線結尾,對全域性變數沒有特別要求, 少用就好, 但如果你要用, 可以用 g_ 或其它標誌作為字首, 以便更好的區分區域性變數.

5:在全域性或類裡的常量名稱前加 k: kDaysInAWeek. 且除去開頭的 k 之外每個單詞開頭字母均大寫
解讀:所有編譯時常量, 無論是區域性的, 全域性的還是類中的, 和其他變數稍微區別一下. k 後接大寫字母開頭的單詞:

const int kDaysInAWeek = 7;


6:常規函式使用大小寫混合, 取值和設值函式則要求與變數名匹配: MyExcitingFunction(), MyExcitingMethod(), my_exciting_member_variable(), set_my_exciting_member_variable().

解讀:注意的就是:類的私有變數的取值和設值函式需要與變數名匹配

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_;
};


7:名字空間用小寫字母命名, 並基於專案名稱和目錄結構: google_awesome_project.

解讀:名稱空間需要一目瞭然其專案和結構

8:列舉的命名應當和 常量 或 巨集 一致: kEnumName 或是 ENUM_NAME.

enum UrlTableErrors {
    kOK = 0,
    kErrorOutOfMemory,
    kErrorMalformedInput,
};
enum AlternateUrlTableErrors {
    OK = 0,
    OUT_OF_MEMORY = 1,
    MALFORMED_INPUT = 2,
};

9:通常 不應該 使用巨集. 如果不得不用, 其命名像列舉命名一樣全部大寫, 使用下劃線:

譯者(acgtyrant)筆記

感覺 Google 的命名約定很高明,比如寫了簡單的類 QueryResult, 接著又可以直接定義一個變數 query_result, 區分度很好;再次,類內變數以下劃線結尾,那麼就可以直接傳入同名的形參,比如 TextQuery::TextQuery(std::string word) : word_(word) {} , 其中 word_ 自然是類內私有成員。

總之,最重要的是保證專案中命名的一致性!