背景
每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,而复杂性会使得代码更容易出现bug、难于阅读和维护。
本规范的目的是通过详细阐述如何进行C++来规避其复杂性,使得代码在有效使用C++语言特性的同时还易于管理。
C++包含大量高级特性的巨型语言,某些情况下,我们会限制甚至禁止使用某些特性使代码简化,避免可能导致的各种问题。
命名规范
通用命名规则
类型名
类型名(类、结极体、类型定义(typedef)、枚举)以大写字母开始并混合大小写,如
Line, SavingsAccount
变量名
变量名必须以小写字母开始并混合大小写, 如
line, savingsAccount
函数名
函数名必须以小写字母的动词开始并混合大小写,如:
getName(), computeTotalWidth()
常量名
常量名(包括枚举值)必须全部大写并以下划线分隔,如
MAX_ITERATIONS, COLOR_RED, PI
类的私有变量
类的私有变量必须以下划线_作为后缀,如:
class SomeClass {
private:
int length_;
}
名字空间
名字空间的命名必须全部小写,如:
model::analyzer, io::iomanager, common::math::geometry
接口类
接口类的命名以前缀的大写I后跟类名, 如:
class IFoo
{
public:
virtual ~IFoo(){};
virtual void dooo() = 0;
}
模板类型名
模板类型命名必须是单个大写字母,如:
template<class T> ...
template<class C, class D> ...
缩略语
缩略语不必都是大写,如:
exportHtmlSource(); // 这样不好: exportHTMLSource();
openDvdPlayer(); // 这样不好: openDVDPlayer();
全局变量
全局变量命名规则同变量名,只是全局变量必须总是以::来引用,如:
::mainWindow.open(), ::applicationContext.getName()
通用变量
通用变量(如函数参数)的命名应该就是它的类型,且首字母小写,如:
void setTopic(Topic* topic) // 这样不好: void setTopic(Topic* value)
// 这样不好: void setTopic(Topic* aTopic)
// 这样不好: void setTopic(Topic* t)
void connect(Database* database) // 这样不好: void connect(Database* db)
// 这样不好: void connect (Database* oracleDB)
文件名
文件名全部小写,C++文件以.cpp结尾,头文件以.h结尾,文件名与文件里类的名字相同。
非通用命名规则
非通用变量(如局部变量)可以是这样:
Point startingPoint, centerPoint;
Name loginName;
函数名中不应该再包括对象名,如:
line.getLength(); //这样不好: line.getLineLength();
特殊命名规则
指针命名:
Line* line; // 这样不好: Line* pLine;
// 这样不好: Line* linePtr;
枚举常量可以使用一个公共的类型名作为前缀,如:
enum Color {
COLOR_RED,
COLOR_GREEN,
COLOR_BLUE
};
bool类型的变量和函数返回值是bool的函数以is为前缀来命名,如:
isSet, isVisible, isFinished, isFound, isOpen
在某些情况下,有些比is前缀更适合(has, can, should),如:
bool hasLicense();
bool canEvaluate();
bool shouldSort();
当有属性的情况下,使用get/set来存取,如:
employee.getName();
employee.setName(name);
matrix.getElement(2, 4);
<