1、刘智慧,编码规范培训,内容提要,编码规范概述编码规范细则GAPS二次开发编码规范介绍,IOCCC 国际混乱C代码大赛,#include stdio.hmain(int a, char *b) for(ab+=hello,world!n;(!b)*b,编码规范的必要性,在编程过程中,如果每个程序员都按自己的习惯和风格编写程序,势必降低整个程序的可读性,对软件的测试、交流、重用以及软件的维护等多方面均会产生极为不利的影响。为了解决这个问题,提倡统一风格。 编程水平编程规范编程效率,减少错误的发生,if (i = 0) if (i = 0)if (0 = i) 建议做法,便于后期的维护,你愿意维护别
2、人写的代码吗?,公司编码规范总则,可读性结构化容错性可重用性,内容提要,编码规范概述编码规范细则GAPS二次开发编码规范介绍,编码规范细则,书写排版规范命名规范语言规范其它规范,书写排版规范空格,关键字之后要留空格 if (.),之后要至少要留一个空格void Func(int x, int y)如果;不是一行的结束符号,其后要留一个空格,在for语句居多for (i = 0; i data;,书写排版规范空行,在一个函数体内,变量定义与函数语句之间要加空行 void Function1() int n;空行statement1;,书写排版规范空行,逻揖上密切相关的语句之间不加空行,其它地方应
3、加空行分隔。 if (condition) statement1;elsestatement2;,书写排版规范空行,每个函数定义结束之后都要加一个或若干个空行 void Function1() 空行void Function2() ,书写排版规范对齐,和永远都单独成行并且位于同一列,同时与引用它们的语句左对齐 void Function1() 而不是void Function1() ,书写排版规范对齐,CASE语句语的case部分与switch的列对齐switch (variable)而不是switch (variable)case value1 : case value1 : break;
4、break;case value2 : case value2 : break; break;default : default : break; break; ,书写排版规范缩进,缩进量统一使用4个字符建议使用空格而不是Tab字符 同层次的代码在同层次的缩进层上,书写排版规范长行拆分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首 if (very_longer_variable1 = very_longer_variable12) ,书写排版规范长行拆分,如果函数中的参数较长,则要进行适当的划分void Function(float very_longer_var1, float
5、 very_longer_var2, float very_longer_var3)长字符拆分“very long string line”或者“very long string”“line”,命名规范标示符,变量的名字应当使用“名词”或者“形容词名词” float value;float oldValue;float newValue;,命名规范标示符,函数的名字应当使用“动词”或者“动词名词”(动宾词组)。各单词连写,词首字母大写 例如:DrawBox();,命名规范标示符,所有宏定义、typedef定义类型、枚举常数、常量全用大写字母命名,用下划线分割单词 const int MAX_L
6、ENGTH = 100;#define FILE_PATH “/usr/tmp”,命名规范标示符,全局变量加前缀g_(表示global) 例如:int g_iCount;注:对于int 型,还要加i,命名规范标示符,考虑到习惯性问题,局部变量中可采用通用的命名方式,如n、i作为循环变量,p、q作为指针等,命名规范源文件,采用小写字母命名文件,避免取一些比较通俗的文件名,如:main.c,public.c等。,语言规范宏,宏体和参数都要加上括号 #define MAX(a, b) (a) (b) ? (a) : (b)而不是#define MAX(a, b) a b ? a : b,语言规范表达
7、式,如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级 leap_year = (year % 4 = 0) & (year % 100 != 0) | (year % 400 = 0),语言规范IF语句,if语句本身自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 if (width height) dosomething();而不是if (width = -EPSINON) & (x = EPSINON)(EPSINON是允许的误差,即精度) 而不是if (x = 0.0),语言规范goto语句,少用、慎用goto语句 goto error;error:,
8、语言规范函数,return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁 char * Func(void)char str30;return str;,语言规范注释,一目了然的语句不加注释 i+; /* i 加 1 */ 多余的注释边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要及时删除 注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但不可放在下方。同一结构中不同域的注释要对齐。,其它规范,防止引用已经释放的内存空间char *p = (char *) malloc(100);strcpy(p, “hello
9、”);free(p); /* p 所指的内存被释放,但是p所指的地址仍然不变 */if (p != NULL)/* 没有起到防错作用 */ strcpy(p, “world”);/* 出错 */,其它规范,函数中分配的内存,在函数退出之前要释放 函数中申请的(为打开文件而使用的)文件句柄,在函数退出前要关闭,内容提要,编码规范概述编码规范细则GAPS二次开发编码规范介绍,GAPS编码规范组件函数声明模板,/*组件函数定义组件函数名称: 组件名称: 组件功能: 组件参数: 序号 参数名称 资源类别 缺省值 是否可空 参数说明组件结果状态: 结果状态码 结果说明 缺省日志信息: 日志级别 日志宏响
10、应信息: 内部响应码 内部响应信息 主要操作元素: 元素路径 操作主要操作库表: 表名 操作 使用限制: 项 目 组: 程 序 员: 发布日期: YYYY年mm月DD日修改日期: YYYY年mm月DD日参数使用示例: */IRESULT XXX_XXXXX(HXMLTREE lXmlhandle),GAPS编码规范函数组件库头部注释模板,/*版权所有:杭州恒生电子股份有限公司项目名称:综合应用前置(GAPS)项目版 本:V1.0操作系统:AIX4.3文件名称:文件描述:项 目 组:中间业务产品发展部研发组程 序 员: 发布日期: 修 订: 修改日期: */*修改记录修改日期:修改内容:修改人:*/*总体说明:组件函数名称 组件名称 发布日期 程序员 修改日期 修改人*/,GAPS编码规范ESQL,SQL关键字全部大写 采用ANSI标准定义宿主变量,即以EXEC SQL BEGIN DECLARE SECTION;EXEC SQL END DECLARE SECTION;在每个有返回sqlcode值的SQL语句后,必须检查sqlcode的值,并附加相应的日志记录和处理语句。,Thank you !,