风格:
界面:
除错:
测试:
性能:
可移植性:
至于出处,已经记不得。
- 全局变量用具有描述意义的名字,局部变量用短名字。
- 保持一致性。
- 函数采用动作性的名字。
- 要准确。
- 以缩行形式显士程序的结构。
- 使用表达式的自然形式。
- 利用括号排除歧义。
- 分解复杂的表达式。
- 要清晰。
- 当心副作用。
- 使用一致的缩行和加括号风格。
- 为了一致性,使用习惯用法。
- 用else-if处理多路选择。(这里是指避免使用if里面套if的用法)
- 避免使用函数宏。
- 给宏的体和参数都加上括号。(或者用do{...}while(0);的方式)
- 给神秘的数起个名字。
- 把数字定义为常量,不要定义为宏。
- 使用字符形式的常量,不要用整数。
- 利用语言去计算对象的大小。
- 不要大谈明显的东西。
- 给函数和全局数据加注释。
- 不要注释不好的代码,应该重写。
- 不要与代码矛盾。
- 澄清情况,不要添乱。
界面:
- 隐藏实现的细节。
- 选择一小组正交的几本操作。
- 不要在用户背后搞小动作。
- 在各处都用同样方式做同样的事。
- 释放资源与分配资源应该在同一层次进行。
- 在低层检查错误,在高层处理。
- 只把异常用在异常的情况。
除错:
- 寻找熟悉的模式。
- 检查最近的改动。
- 不要两次犯同样的错误。
- 现在排除,而不是以后。
- 取得堆栈轨迹。
- 键入前仔细读一读。
- 把你的代码解释给别人。
- 把错误弄成可以重现的。
- 分而治之。
- 研究错误的计数特性。
- 显示输出,使搜索局部化。
- 写自检测代码。
- 写记录文件。
- 画一个图。
- 使用工具。
- 保留记录。
测试:
- 测试代码的边界情况。
- 测试前条件和后条件。
- 使用断言。
- 做防御性程序设计。
- 检查错误的返回值。
- 以递增方式做测试。
- 首先测试最简单的部分。
- 弄清所期望的输出。
- 检验那些应当保持的特征。
- 比较相互独立的实现。
- 度量测试的覆盖面。
- 自动回归测试。
- 建立自包容测试。
性能:
- 自动计时测量。
- 使用轮廓程序。
- 集中主意热点。
- 画一个图。
- 使用更好的算法或数据结构。
- 让编译程序做优化。
- 调整代码。
- 不要优化无关紧要的东西。
- 收集公共表达式。
- 用低价操作代替高代价操作。
- 铺开或删除代码。
- 缓存频繁使用的值。
- 写专用的存储分配程序。
- 对输入输出做缓冲。
- 特殊情况特殊处理。
- 预先算出某些值。
- 使用近似值。
- 在某个低级语言里重写代码。
- 使用尽可能小的数据类型以节约存储。
- 不存储容易重算的东西。
可移植性:
- 盯紧标准。
- 在主流中做程序设计。
- 警惕语言的麻烦特性。
- 用多个编译系统试验。
- 使用标准库。
- 只使用到处都能用的特征。
- 避免条件编译。
- 把系统依赖性局限到独立文件里。
- 把系统依赖性隐藏在界面后面。
- 用正文做数据交换。
- 数据交换时用固定的字节序。
- 如果改变规范就应该改变名字。
- 维护现存程序与数据的相容性。
- 不要假定与数据的相容性。
- 不要假定是ASCII。
- 不要假定是英语。
至于出处,已经记不得。