天天看点

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_ 自然是类内私有成员。

总之,最重要的是保证项目中命名的一致性!

继续阅读