0、了解哪些东西不应该标准化
命名规则(参考):类、函数和枚举 LikeThis; 变量名 likeThis; 成员变量名likeThis_; 宏名称
LIKE_THIS;
1、在高警告级别干净利落地进行编译
2、使用自动构建系统
3、使用版本控件系统
4、在代码审查上投入
5、一个实体应该只有一个紧凑的职责
6、正确、简单和清晰第一
7、编程中应知道何时和如何考虑可伸缩性
8、不要进行不成熟的优化
9、不要进行不成熟的劣化
10、尽量减少全局和共享数据
11、隐藏信息
12、懂得何时和如何进行并发性编程
13、确保资源为对象所拥有,使用显式的RAII和智能指针
14、宁要编译时和连接时错误,也不要运行时错误
15、积极使用const
16、避免使用宏
17、避免使用“魔数”
18、尽可能局部地声明变量
19、总是初始化变量
20、避免函数过长,避免嵌套过深
21、避免跨编译单元的初始化依赖
22、尽量减少定义性依赖,避免循环依赖
23、头文件应该自给自足
24、总是编写内部#include保护符,决不要编写外部#include保护符
25、正确地选择通过值、(智能)指针或引用传递参数
26、保持重载操作符的自然语义
27、优先使用算术操作符和赋值操作符的标准形式
28、优先使用++和--的标准形式,优先调用前缀形式
29、考虑重载以避免隐含类型转换
30、避免重载&&、||或,(逗号)
31、不要编写依赖于函数参数求值顺序的代码
32、弄清所要编写的是哪种类
33、用小类代替巨类
34、用组合代替继承
35、避免从并非要设计成基类的类继承
36、优先提供抽象接口
37、公用继承即可替换性。继承,不是为了重用,而是为了被重用。
38、实施安全的改写
39、考虑将虚拟函数声明为非公用的,将公用函数声明为非虚拟的
40、要避免提供隐式转换
41、将数据成员设为私有的,无行为的聚集除外
42、不要公开内部数据
43、明智地使用pimpl
44、优先编写非成员非友元函数
45、总是一起提供new和delete
46、如果提供类专门的new,应该提供所有标准形式(普通、衣服和不抛出)
47、以同样的顺序定义和初始化成员变量
48、在构造函数中用初始化代替赋值
49、避免在构造函数和析构函数中调用虚拟函数
50、将基类析构函数设为公用且虚拟的,或者保护且非虚拟的
51、析构函数、释放和交换绝对不能失败
52、一致地进行复制和销毁
53、显式地启用或者禁止复制
54、避免切片,在基类中考虑用克隆代替复制
55、使用赋值的标准形式
56、只要可行,就提供不会失败的swap(而且要正确地提供)
57、将类型及其非成员函数接口置于同一名字空间中
58、应该将类型和函数分别置于不同的名字空间中,除非有意想让它们一起工作
59、不要在头文件中或者#include之前编写名字空间using
60、要避免在不同的模块中分配和释放内存
61、不要在头文件中定义具有链接的实体
62、不要允许异常跨越块边界传播
63、在模块的接口中使用具有良好可移植性的类型
64、理智地结合静态多态性和动态多态性
65、有意地进行显式自定义
66、不要特化函数模板
67、不要无意地编写不通用的代码
68、广泛地使用断言记录内部假设和不变式
69、建立合理的错误处理策略,并严格遵守
70、区别错误和非错误
71、设计和编写错误安全代码
72、优先使用异常报告错误
73、通过值抛出,通过引用捕获
74、正确地报告、处理和转换错误
75、避免运用异常规范
76、默认时使用vector,否则,选择其他合适的容器
77、用vector和string代替数组
78、使用vector(和string::c_str) 与非C++API交换数据
79、在容器中只存储值和智能指针
80、用push_back代替其他扩展序列的方式
81、多用范围操作,少用单元素操作
82、使用公认的惯用法真正地压缩容量,真正地删除元素
83、使用带检查的STL实现
84、用算法调用来代替手工编写的循环
85、使用正确的STL查找算法
86、使用正确的STL排序算法
87、使谓词成为纯函数
88、算法和比较器的参数应多用函数对象少用函数
89、正确编写函数对象
90、避免使用类型分支,多使用多态
91、依赖类型,而非其表示方式
92、避免使用reinterpret_cast
93、避免对指针使用static_cast
94、避免强制转换const
95、不要使用c风格的强制转换
96、不要对非pod进行memcpy操作或者memcmp操作
97、不要使用联合重新解释表示方式
98、不要使用可变长参数(...)
99、不要使用失效对象,不要使用不安全函数
100、不要多态地处理数组