总结
王伟冰
简洁原则:写出来的代码要尽量简洁,避免重复。
1 把经常用到的代码段写成一个函数,可以简化代码。
2 把函数定义为与之密切相关的类的成员函数,可以简化函数实现的代码。
3 对于内部实现不同但对外接口相同的类成员函数,可以建立共同的基类虚函数(或Java和C#中的接口),从而可以在外部代码中统一处理,简化外部代码。
4 对于内部实现完全一致的类成员变量和函数,可以放在基类中统一实现,简化内部代码。
5 应当充分利用语法糖来简化书写,但也不要太过依赖。
安全原则:写出来的代码要不易出错,易于查错。
1 要保证每个指针或引用不指向实际并不存在的变量。
2 在堆中创建的变量,要保证能回收。
3 如果外界代码对类的某个成员变量或函数的随意访问可能导致不好的结果,则应该把它设为私有成员。
4 复制或传递函数参数时,要清楚复制或传递的是指针(引用)还是数值。
5 要确保每个数组的下标访问不会越界,每个函数的输入参数都合法。
6 同时使用两个指针(或引用)时,要考虑两个指针(或引用)引用同一个变量的情况。
7 写代码时注意避免语言陷阱。
8 每次进入函数调用或进入循环体的时候,要记得对相关的变量重新初始化。
9 要运用异常机制或错误代码的方式,来处理可能遇到的异常情况。
10 修改线程的共享变量时,最好对它加锁。
11 在使用同步事件或同步锁的时候,要防止死锁。
快速原则:写出来的代码要快速运行,尽量省时。
1 尽量减少对变量的复制。
2 尽量利用先前算出的结果。
3 尽量减少对用不到的数据的计算。
4 尽量减少循环内的重复计算。
5 尽量减少不必要的函数调用,或使用内联函数。
6 尽量使用局部变量。
7 提高数据访问的时空局部性。
8 运用多线程,可以让多个操作同时进行,节省不必要的等待时间。
9 在多核的情况下使用多线程,可以提高程序的性能。
10 避免用轮询来实现线程同步,而是用睡眠或同步事件。
灵活原则:写出来的代码要易于更改,易于扩展。
1 对于有可能改变的数值,不要写死,可以作为函数参数传进来。
2 对于有可能改变的类型,不要写死,可以写成模板,把类型作为模板参数传进来。包括类模板和函数模板。
3 尽量利用已有的类和函数来构造新的功能,而不改变类和函数的内部代码。
4 当一个函数里有一段有可能改变的代码时,不要写死,可以把这段代码委托给一个传进来的函数指针去执行。
5 如果需要对函数指针进行更加灵活的定制,可以使用函数对象或者lambda表达式。
6 对于只在模块内部使用到的代码,访问限制松一些,参数检查松一些,类和变量的命名随意一些。会被外部使用到的代码则相反。
7 将需要经常改动或将来有可能改动的因素所对应的代码量减到最少。
清晰原则:写出来的代码要意图清晰,易于阅读。
1 一个函数的函数名、参数个数和类型、返回值类型应该能够自然地体现出这个函数所要实现的操作。
2 严格控制变量作用域,只有真正需要用到某个变量的代码段才可以访问到这个变量。
3 尽量减少对类和函数的用法的无理规定。
4 一个变量、函数或类的重要性越大,它的名字就越应该清晰地表达出它的作用。
5 通过减少全局变量,使用命名空间和静态成员,可以避免命名冲突,同时使代码之间的关系更为清晰。
6 把功能相近、关联密切、调用层次相近的函数放到同一个类、同一个命名空间或同一个文件里,可以使整个程序的架构清晰。
测试
1 自动化原则:尽量把测试所要做的人工操作减到最少。
2 写到哪就测到哪。
3 合理安排测试的顺序。
4 测试不同的平台和环境。
5 测试集尽量多样化。
6 要测试非法输入和边界值附近的输入。
其它
宏思想原则:运用宏、常量、typedef、内联函数、sizeof、枚举、条件编译之类的语言特性,可以使程序便于书写,便于修改,便于理解。
省空间原则:尽量不让用不到的变量继续占有空间。
重构原则:时不时要进行重构,虽然没有改变它的功能,但是可以使它变得更清晰、更灵活,方便添加新功能。
调试技巧:断点、单步执行、监视、条件中断、控制变量法、二分法、同步法。