1、宏定义格式:每个单词用下划线隔开。示例:
#define XXX_YYY 20
#define、XXX_YYY、20各用两个tab隔开
2、一律不得出现常量,对于出现的常量(指数字和字符串),用意义明显的宏定义(或枚举变量)代替。
3、每个函数体不能过长,原则上不超过200行
4、每个文件不能过长,原则上不超过2500行
5、类的规则:
(1)构造函数与析构函数放置在public下,并与其他public隔开
(2)消息映射函数统一放在一个public下,格式如下:
LRESULT
OnXxx(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled);
(3)函数的实现体格式:
BOOL
ClassName::FunctionA(CString strVal)
{
....................
}
6、函数中不出现复杂的计算公式,一律用宏定义代替,定义时,一定要注意变量加空格。
7、函数必须用意义明确的英文单词定义。
8、每个函数必须注释其功能(简单函数除外),重要变量也要注释其用处。
9、特殊变量的类型如果考虑到以后可能更改的话,用typedef来重定义一下,以后要该的话,只需更改一处就可以了。
注意要与模板编程联系到一起,做到类型“复用”。
10、CDC的attach和detach要成对使用,GetDC和ReleaseDC成对使用。
切记,否则容易造成GDI句柄泄露
11、类指针的使用一定要判断当前指针是否为NULL
这个功能可以用一个宏定义来实现。如果类似的宏定义多的话,可以总结在一个单独的文件里
12、对于变量赋值二选一的操作,建议用三元操作符 ?:
15、如果一个宏是由两外两个宏计算得到一定要加括号。例如:
#define MAX_CAND_NUM (CANDCEL_ROW_NUM*CANDCEL_COL_NUM)
16、一个工程大致分为下面几部分:
(1)窗体的界面绘制类:负责子窗体的定位。
(2)消息处理类:绘制类中只负责接受消息,此类负责处理(1、2可以合并)。
(3)工具类:负责数据合法性校验。不能有成员变量,也不进行宏、常量的定义(除非必须),完全由传进来的参数,按照某种规则进行处理。
(4)数据处理类:负责数据的产生、处理。按照界面绘制类所需的格式进行返回,中间不需其他工具类的处理,但少量数据可以由工具类进行数据处理类和界面绘制类的中间转换。此类里不能有extern定义的全局变量的引用,如果需要则传引用。
17、在绘图函数中不要做与绘制不相关的一切操作,只允许对背景、图片、或显示的更改,其他任何操作都禁止,任何!
18、函数命名规则
(1)获取某个字段。形式:修饰限定词 + Of + 字段名。
20、利用抽象类等技术尽量提高代码的可重用性。(见例子)
21、出了函数功能单一外,变量功能也要单一。即变量要尽量保持只有在循环、递归或者结果收集等他殊情况下,赋值次数才能够超过一次。
22、界面主程序尽量不含有与界面控制相关的变量、函数,这些变量、函数一律组合成一个合适的对象。
23、If等表达式的条件尽量简单,如果过于复杂则将复杂表达式(或其中一部分)的结果存放到一个临时变量,以此变量名称来解释表达式的用途。
24、对于构造函数比较好的写法是,使用所谓的member intialization list(成员初值列表)替换赋值动作,例如:
ABEntry:ABEntry():theName(name),numTimesConsulted(0)
{ }
常规构造函数如下,但效率通常不如上面的高。
ABEntry:ABEntry()
{
theName = name ; numTimesConsulted = 0;
}
25、写类或者函数时候,要充分考虑将来所有的可能性。例如参数、返回值的类型有可能变动。例如一个函数CString GetText ( int index );其实这个函数在将来有可能返回其他类型例如ushort类型,这个时候函数名也要随着更改,如果这个函数返回的是ushort类型,函数名却潜意识告诉我们他返回一个Text,,而Text容易让我们想到Cstring(或与之兼容或可以转换的类型,例如char *)。另外这个函数的参数index,也有可能更改因为我们有可能用一个CString,去索引另外一个CString。
26、所有的数据都应该初始化,不管这是一个内置类型还是自定义类型。
27、关于数据结构、宏定义和常量定义最好都定义在一个单独的文件中,这样方便后来扩展时候使用。