1、为国际化方便、resource里资源ID不能重复,每个控件须命名(STATIC也不例外),每个窗体分配500个ID(预留一部分),各窗体ID段之间须预留100个编号为后期扩充之需;
2、代码编写务求严谨,编译不允许出现warning、0警告是必须的、逻辑路径要全、不允许半开半闭的逻辑路径;
3、不同版本函数族、禁止混搭(比如多线程函数族:C运行时库 _beginthread/ex, C++ std::thread,Win32 CreateThread/WaitXXX系列, MFC AfxBeginThread系列,内存分配函数族 malloc/free 和 new/delete,字符串函数族 _tcsxxxx, strxxxx, wcsxxxx, 三套函数);
4、非万不得以,不要用goto语句,实在必须,请用MQ机制;
5、不要加无效锁、不要在遥远的非共享代码段前后加锁,==0,请只在共享代码段前后加锁,否则==0;
6、相等关系运算符,一律用 if (常量== 变量)形式,不允许用 if (变量== 常量)的形式,避免少写个=产生赋值;浮点数一律用差值小于某阈值,比如0.0000001
7、消息映射一律放到DECLARE_MESSAGE_MAP()里面去,不要零散分布到处都是;
8、由于内存对齐原因,请将相同基本类型的类成员声明在一块,控件类型成员声明在一块,同组功能的方法声明在一块;
9、一个函数体不要超过50行、功能要单一,不杂交耦合,内聚度越高越好;
10、一个类的声明不要超过200行、功能尽可能单一、尽量减少组合模型式扩充,保证耦合度越低越好;
11、一个cpp实现体不要超过2000行、若超过,请再封装成原子操作函数进行调用;
12、每个方法声明处必须有注释,重载方法必须说明区别、注释量占代码量20%~30%为佳;
13、数值型常量、少用宏定义,多用const定义;精度允许范围内、能用整形类型的,尽量少用浮点型;
14、分支型处理、少用宏开关分支,多用switch分支;类层次间的多用虚函数代替switch选择;
15、if/else不要层层嵌套太深,能抽出来尽量抽出来,保证代码可读性;
16、为提升性能、形参尽可能用引用类型或指针类型、返回值是对象的更应如此;
17、为提升性能、在预知最大数量的情况下,尽量用固定大小数组代替动态增容的容器类对象;
18、为提升性能、查找性能要求高的、尽量建立map或hashmap,删除和插入性能要求高的、尽量建立链表;时间复杂度和空间复杂度须考虑;
19、为提升性能、不搭边不干涉的多个功能同时跑时、建议创建多个线程平行处理;
20、为提升性能、尽量减少内存管理器和内存拷贝函数的调用;(备注: 它们一个函数的底层实现机器指令数量、比一般函数多许多倍);
21、为提升性能、少用字符串对象,因为它会复制/拷贝/创建/销毁,每一步都跟上一条有关,每一条指令都比普通指令多几十倍的机器指令数;
22、为提升性能、多重循环尽量编写成单重循环;
23、为提升性能、对于无法避免的且必须多重循环的,循环量最大的放在最内侧,以提高在高速缓存中的命中率、减少CPU在内存与高速缓存之间来回加载/切入次数,毕竟内存与CPU高速缓存R/W速度相差几个数量级;
24、为提升性能、尽量减少I/O操作,在内存中操作、毕竟I/O操作与内存操作又相差几个数量级;
25、为提升性能、能使用顺序存储数据结构的就尽量不要用非顺序存储数据结构,因为非顺序存储的读写周期是顺序存储的读写周期的许多倍;
26、为提升性能、能一次读取多字节的,尽可能大的一次性读取,让主机可能的对齐式内存访问;切记不要一次读一个字节,因为非对齐内存访问效率极低;
27、为避免卡顿僵死、不允许在Command事件的Handler里编写运行耗时超过100ms的处理、阻塞了UI线程的消息循环;
28、尽量在变量定义的时候就赋予初始值、避免使用时忘记赋初值;
29、尽量在加锁的同时、写好解锁语句、避免忘记解锁导致死锁;
30、尽量在new或malloc的同时、写好free和delete、避免忘记导致内存泄漏;
31、尽量在LoadImage等加载资源地方的同时、写好DeleteXXX或DestroyXXX,避免忘记而累计加载资源过多导致软件极慢甚至崩溃;
32、尽量在各项目统一基本数据类型头文件、统一枚举类型或宏定义、统一常用基本工具类、统一IDE工具、减少移植障碍、统一src版本控制工具、规范行为一致性;
33、尽量在定于结构体或类时、预留两三个成员占位符,为后期扩充做准备;
34、尽量不要在程序界面显示出来之前,做大量耗时处理,避免给用户双击无效的错觉而拼命双击、显示出来之后初始化并提示;
35、尽量不要主UI线程中做初始化动作,阻塞了UI的消息循环,给用户界面僵死卡顿等不友好体验UFUE;
36、对于共享资源,请做好原子性操作的同步措施,对于共享基本变量,请使用原子操作函数或者定义原子变量或寄存器变量,避免[高速缓存<->内存]回写时间差中被另一线程读取/篡改;
37、单进程空间中、允许创建的内核对象和GDI对象数量极为有限、用户态内存也极其有限,请在创建时就写好释放代码,避免对象数量上升导致软件卡顿、久之闪崩;
38、对于大的单资源对象,尽可能只加载一份共享,而不要每个窗体都加载一遍,因为单进程内存容量十分有限,同时OS一直在帮助进程在高速缓存<->内存<->虚拟内存(硬盘)之间进行内存管理,对命中频次低的不用资源的回写、当使用时又加载回来。这是当许多资源只加载不释放,达到一定数量之后、软件会变得异常慢的底层原因之一。
39、当需要频繁使用内存管理时,请创建内存池,进行内存复用,减少内存的动态申请/销毁的及其碎片重整;
40、当需要频繁使用线程时时,请创建线程池,进行线程复用,减少线程的动态创建和销毁的开销;
41、当需要提高产出效率时,请创建多线程并发,进行时间复用;
42、杜绝挖坑设计、杜绝误导性注释、
43、尽可能减少项目易手,保证需求完整性、减少需求信息的传递损失、保证代码纯洁性及稳定性;