源代码是更多是给开发人员阅读的而不是给编译器编译的,因此,源代码应该具有良好的可读性。为了让其他人能尽量读懂你写的代码,良好的命名是其中的关键因素。
具体为:源代码文件、命名空间、类、模板、函数、参数、变量名、常量名等都应该具有有意义且富有表现力的名字。
如果给变量、类或函数想出合适的名称很困难,这很可能表明代码存在某些困难或设计缺陷,这时候应该找到并解决命名困难的根本原因。
以下是对良好命名的具体建议。
即不需要注释解释名称的含义,能够看到名称就能够理解其用途。
不好的命名例子:
- uint unm;
- bool flag;
- QList
list; - QString data;
好的命名例子:
- uint numberOfPerson;
- bool isChanged;
- QList
costomersList; - QString personalInformation;
应注意不要使用太冗长的名称。如果变量的上下文很清晰,则可以使用较短和较少描述性的名称。例如:
- struct personInfo
- {
- QString nameOfPerson;
- int ageOfPerson;
- };
知道这是关于人的信息的结构体,变量中使用 person 就多余了,可写作:
- struct personInfo
- {
- QString name;
- int age;
- };
(只是一个说明的例子,一般人也不这么写代码的...)
即以应用程序域的概念和元素命名组件、类、函数等。
例如:
- class QueryStudentCourseSelection
- {
- public:
- Student identityStudent(const int StudentID);
- CourseList getAllSelectedCourseList(const int StudentID);
- Teacher viewTeacherInformation(std::string teacherName);
- };
这是一个学生选课相关的类,它里面的各种定义使用了和教育领域相关的元素,这使得这个类的功能相当容易理解。
对于分层的结构,层级越深入名称就越具体。
- class CarFactory
- {
- public:
- CarFactory();
- void produceCars(int number);
- };
-
- class GreenCarFactory : public CarFactory
- {
- public:
- GreenCarFactory();
- void produceGreenCars(int number);
- };
应该避免使用这种名称:
- class Movie
- {
- private:
- QString stringTitle;
- };
电影名称是一个字符串,名称前面的 string 明显多余。
写变量名称时应该使用完整的单词而不是单词缩写,这会增加代码的可读性。
- QString PWD;//不建议写法
- QString password;//建议写法
现在的开发工具相当智能,不必要通过变量名来知道其类型。
可能会是阅读代码的人产生误解。
代码应该尽量自解释,尽量让代码本身好懂。即尽量做到不写注释,除非是要特别说明的地方。
块注释:在函数前面或者类前面的说明其功能或标识版权信息的占多行的注释文字。这种块注释正面意义不大。
当函数代码有如下迹象说明应该考虑拆分函数:
这里可能有很多人不同意但我赞同作者的看法:函数应该尽可能小,理想情况是四五行,最多十几行。
关于函数调用的开销是不成问题的,现代的c++编译器及其擅长优化且好的CPU每秒可执行上百亿条指令。真正导致性能出现问题的往往是糟糕的架构和设计,只有在极端特殊的情况下才需要担心函数调用的开销。
违反 const 会导致编译错误,这可以节省调试时间,且使用 const 可以使编译器支持一些优化,即提高程序执行性能。
正确解读 const 修饰的对象:const 总是修饰它左边的内容,左边没有内容时修饰它右边的内容(指向对象的指针还是对象本身)。
不要使用宏,如果要定义一个常量应该使用 const。