程序设计风格
1.最终目的是设计一个好的软件;
好软件的标准:
一,正确性-能完成需求中的所有要求;
二,可扩展性-易于修改;
三,高效的数据结构与算法;
四,易读性;
五,可移植性等;
大道至简。
2.变量名,宏定义,见名知义
3.空格和缩进
一致性和习惯用法
4. If(i==0){
//TODO
}
尽量用If()else if() else{} 而非switch(){case 1: break;//fall through};case0:case 1:case2: ;;;break;
5.enum,const,#define 代替魔数。
6.注释;简单而不过分简单;
7.数据结构与算法
最基本的:基本检索和排序;
8.界面 在进行设计的时候,必须考虑的问题包括:
•界面:应提供哪些服务和访问?界面在效能上实际成为服务的提供者和使用者之间的一
个约定。在这里要做的是提供一种统一而方便的服务,使用方便,有足够丰富的功能,
而又不过多过滥以至无法控制。
•信息隐藏:哪些信息应该是可见的,哪些应该是私有的?一个界面必须提供对有关部件
的方便访问方式,而同时又隐蔽其实现的细节。这样,部件的修改才不会影响到使用
者。
•资源管理:谁负责管理内存或者其他有限的资源?这里的主要问题是存储的分配和释放,
以及管理共享信息的拷贝等。
•错误处理:谁检查错误?谁报告?如何报告?如果检查中发现了错误,那么应该设法做
哪些恢复性操作?
一个界面要想成功,它就必须特别适合有关的工作—必须简单、通用、规范、其行为
可以预料及坚固等等,它还必须能很好地适应用户或者实现方式的变化。
9.应该先检查所有的变量是否都正确地进行了初始化。
对于测试,惟一的、最重要的规则就是必须做。
风格
全局变量用具有描述意义的名字,局部变量用短名字。
保持一致性。(缩进,空格等)
函数采用动作性的名字。(Send)
要准确。
以缩行形式显示程序结构。
使用表达式的自然形式。
利用括号排除歧义。
分解复杂的表达式。
要清晰。
当心副作用。
使用一致的缩行和加括号风格。
为了一致性,使用习惯用法。
用else-if 处理多路选择。(少用switch)
避免使用函数宏。
给宏的体和参数都加上括号。
给神秘的数起个名字。(#define,const,enum)
把数定义为常量,不要定义为宏。(const而非#define)
使用字符形式的常量,不要用整数。
利用语言去计算对象的大小。(sizeof)
不要大谈明显的东西。
给函数和全局数据加注释。
不要注释不好的代码,应该重写。
不要与代码矛盾。
澄清情况,不要添乱。
界面
隐蔽实现的细节。
选择一小组正交的基本操作。
不要在用户背后搞小动作。
在各处都用同样方式做同样的事。
释放资源与分配资源应该在同一层次进行。
在低层检查错误,在高层处理。
只把异常用在异常的情况。
排错
寻找熟悉的模式。
检查最近的改动。
不要两次犯同样错误。
现在排除,而不是以后。
取得堆栈轨迹。
键入前仔细读一读。
把你的代码解释给别人。
把错误弄成可以重现的。
分而治之。
研究错误的计数特性。
显示输出,使搜索局部化。
写自检测代码。
写记录文件。
画一个图。
使用工具。
保留记录。
测试
测试代码的边界情况。
测试前条件和后条件。
使用断言。(assert)
做防御性程序设计。
检查错误的返回值。
以递增方式做测试。
首先测试最简单的部分。
弄清所期望的输出。
检验那些应当保持的特征。
比较相互独立的实现。
度量测试的覆盖面。
自动回归测试。
建立自包容测试。
性能
自动计时测量。
使用轮廓程序。
集中注意热点。
画一个图。
使用更好的算法或数据结构。
让编译程序做优化。
调整代码。
不要优化无关紧要的东西。(不要过度优化)
收集公共表达式。
用低代价操作代替高代价操作。
铺开或者删除代码。
缓存频繁使用的值。
写专用的存储分配程序。
对输入输出做缓冲。
特殊情况特殊处理。
预先算出某些值。
使用近似值。
在某个低级语言里重写代码。
使用尽可能小的数据类型以节约存储。(char)
不存储容易重算的东西。
可移植性
盯紧标准。
在主流中做程序设计。
警惕语言的麻烦特性。
用多个编译系统试验。
使用标准库。
只使用到处都能用的特征。
避免条件编译。
把系统依赖性局限到独立文件里。
把系统依赖性隐藏在界面后面。
用正文做数据交换。
数据交换时用固定的字节序。
如果改变规范就应该改变名字。
维护现存程序与数据的相容性。
不要假定是A S C I I。
不要假定是英语。(国际化)
...............................................................................