特殊说明:版权归个人所有,请勿转载,谢谢合作。
良好的编程风格是提高程序可靠性非常重要的手段,也是大型项目多人合作开发的技术基础。通过规范定义来避免不好的编程风格,增强程序的可读性,便于自己和他人理解。代码规范,针对于不同的企业来说各不相同,追其根源,都源于匈牙利命名法。
1.4.1 变量命名
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆、容易理解的原则。保证名字的连贯性是非常重要的,表1.1描述了变量定义的数据类型部分。
- 表1.1 数据类型部分
前缀 | 表示数据类型 |
c | char类型 |
by | BYTE类型 |
n | Short类型 |
i | int类型 |
x, y | 分别用作x坐标和y坐标 |
cx, cy | 分别用作x长度和y长度,c代表Count |
b | BOOL 类型 |
f | float类型 |
w | WORD类型 |
l | LONG类型 |
dw | DWORD类型 |
u | 无符号类型 |
fn | 函数 |
s | string(串) |
sz | 以0结尾的字符串类型 |
h | 句柄类型 |
p | 指针类型 |
表1.2描述了变量定义的属性部分。
- 表1.2 属性部分
前缀 | 表示数据类型 |
g_ | 全局变量 |
c_ | 常量 |
m_ | C++类成员变量 |
s_ | 静态变量 |
表1.3描述了变量定义的描述部分。
- 表1.3 描述部分
关键词 | 描述 |
Max | 最大 |
Min | 最小 |
Init | 初始化 |
T(或Temp) | 临时变量 |
Src | 源对象 |
Dest | 目标对象 |
命名必须具有实际的意义,形式为xMaxValue,x由数据类型或属性部分组成(如果x为整型,变量命名为:iMaxValue),Max、Value表示连续意义字符串(由描述部分确定),如果连续意义字符串有多个,则每个具有意义的字符串,首字母需大写(像iMaxValue中的“M”与“V”)。
m_ 类成员变量 m_iVal , m_bFlag
g_ 全局变量 g_iMsg , g_bFlag
s_ 静态变量 s_iCount, s_bFlag
局部变量中可采用如下几个通用变量:iTemp ,iResult,i,j(一般用于循环变量)。
1.4.2 常量命名和宏定义
常量和宏定义必须具有实际意义。常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一条定义的右侧必须在41个位置处有一简单的注释,说明其作用。资源名称定义格式如表1.4所示。
- 表1.4 资源名称定义格式
名称 | 关键词内容 |
菜单 | IDM_XX或者CM_XX |
位图 | IDB_XX |
对话框 | IDD_XX |
字符串 | IDS_XX |
表1.4关键词内容列中,“XX”所代表的是资源控件ID所代表的具体含义。例如,实现登录功能的对话框,命名为:“IDD_LOGIN”。
1.4.3 函数命名
第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线间隔,示例如下:
int GetValue();
void* Word_GetApp();
如果使用的是函数指针,则以“fn”开头,再加上函数的具体含义。例如,一个实现获得最大值的函数指针,定义应为:“… fnGetMax(…)”。
1.4.4 结构体命名
结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。全局数据定义只需注意其用途。
示例如下:
typedef struct { char szProductName[20]; char szAuthor[20]; char szReleaseDate[16]; char szVersion[10]; unsigned long ulMaxTables; unsigned long ulUsedTables; }DBS_DATABASE; DBS_DATABASE GdataBase;
1.4.5 控件的命名
控件的命名需要用小写前缀表示类别,如表1.5所示。
- 表1.5 控件命名前缀
前缀 | 类型内容 |
fm | 窗口 |
cmd | 按钮 |
cob | Combo Box(下拉式列表框) |
txt | 文本输入框 |
lab | Labal(标签) |
img | Image(图像) |
pic | Picture |
grd | Grid(网格) |
scr | 滚动条 |
lst | List Box(列表框) |
frm | Fram(框架) |
1.4.6 引用模板示例
文件头的注释模板:
//***************************************************************************** // FILE : XX.h //***************************************************************************** // POWER : Copyright (c) 2012 for NSI(沈阳航空航天大学-北方软件学院). // AUTHOR : 2012-2-7 8:37 Create by lixinghua for functions. // VERSION : V1.0.0.1 // NOTE : 此文件中含有XXX类,各类之间的主次关系,主要功能, // 或潜在的问题。以及全局变量或函数 的作用。 //***************************************************************************** //
说明:
(1)每行字符不得超出80个字符(“/”加上“*”的总长度为80个字符;
(2)“FILE”为文件名;
(3)“POWER”为版权信息,为固定模式无需修改;
(4)“AUTHOR”为作者信息,需要时间的写法;
(5)“VERSION”为版本信息,版本说明见“1.4.7章节 关于版本控制”;
(6)“NOTE”为本文件中存在的程序功能进行说明。
类的注释模板:
//============================================================================= // NAME : XX类 //============================================================================= // LIST : void // AUTHOR : 2012-2-6 11:18 Create by lixinghua for functions. // VERSION : V1.0.0.1 // NOTE : 类的使用说明,即主要对外接口(函数)以及主要功能和潜在问题。 //============================================================================= //
说明:
(1)每行字符不得超出80个字符(“/”加上“=”的总长度为80个字符;
(2)“NAME”为类的名称;
(3)“LIST”为实现的内部方法(函数)列表,并进行说明;
(4)“AUTHOR”为作者信息,需要时间的写法;
(5)“VERSION”为版本信息,版本说明见“1.4.7章节 关于版本控制”;
(6)“NOTE”为本文件中存在的程序功能进行说明。
函数开头的注释模板:
//----------------------------------------------------------------------------- // FUNC : XX函数 //----------------------------------------------------------------------------- // IN : 变量1,变量1功能的说明; // 变量2,变量2功能的说明; // 变量n,变量n功能的说明; // OUT : void // RETURN : void // AUTHOR : 2012-2-6 11:18 Create by lixinghua for functions. // NOTE : 此函数实现了XX功能,其中调用了XX函数。 //----------------------------------------------------------------------------- //
说明:
(1)每行字符不得超出80个字符(“/”加上“-”的总长度是80个字符;
(2)“FUNC”为函数的名称;
(3)“IN”为输入的参数;
(4)“OUT”为在函数内部的输出信息内容,即函数参数作为返回值的说明;
(5)“RETURN”函数的返回值(如:函数成功返回TRUE,否则返回FALSE。);
(6)“AUTHOR”为作者信息,需要时间的写法;
(7)“NOTE”为函数功能的描述,其中包括:功能描述、全局变量描述以及调用模块。
1.4.7 关于版本控制
以版本“V2.20.15.80”为例,含义如下:
其中 V2.20.15.80 ,80表示每修复一处问题,在原有数值上累加一次。
其中 V2.20.15.80 ,15表示添加或删除某些功能(函数或类),在原有数值上累加一次。
其中 V2.20.15.80 ,20表示每维护一次程序,在原有数值上累加一次。
其中 V2.20.15.80 ,2表示每一次系统整体的更新,包括整个功能甚至需求的变化更新,在原有数值上累加一次。
整体含义,表示整体需求或框架升级过2次,维护过20次,共添加或删除功能15次,累计修改问题80次。
1.4.8 代码规范例举
【例1-2】以SetDemoTitle函数为例,SetDemoTitle函数实现了设置标题功能,函数原型如下:
//----------------------------------------------------------------------------- // FUNC : 设置模块标题函数 //----------------------------------------------------------------------------- // IN : const char * pszTitle,传入的标题名称; // OUT : void // RETURN : 标题设置成功返回TRUE,否则返回FALSE。 // AUTHOR : 2012-2-6 11:18 Create by lixinghua for functions. // NOTE : 此函数主要用于,设置程序标题文字。方法中使用了全局变量 // g_bIsSetTitle。 //----------------------------------------------------------------------------- // BOOL g_bIsSetTitle = FALSE; BOOL SetDemoTitle(const char * pszTitle) { // Added by PengMo. if (NULL == pszTitle) // 思考一下 为什么不写成 if (pszTitle == NULL) { return FALSE; } SetWindowText(pszTitle); g_bIsSetTitle = TRUE; return TRUE;