软件设计
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
目 录
1
2 前言 ....................................................................... 1 命名规
则 ................................................................... 1
2.1
2.2
2.3
2.4
3
4 总则 .................................................................. 1 变量命名规
则 .......................................................... 1 自定义的函数、过程名命名规
则 .......................................... 2 数据库对象命名规则 .................................................... 2 编程
风格规定 ............................................................... 3 编程规
范 ................................................................... 4
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9 排 版 ................................................................ 4 注
释 ................................................................ 6 标识符命名 ........................................................... 10 可读性 ............................................................... 11 变量、结
构 ........................................................... 11 函数、过程 ........................................................... 14
宏 ................................................................... 17 程序效率 .............................................................
19 质量保证 ............................................................. 21
广西南博国际信息有限公司 编程规范
1 前言
制订本编程规范的目的是为……系统中, 提供一个科学的、规范化的编程
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
, 使所编制
的程序具有统一的风格、易于理解、易于维护。
本规范为软件开发项目的设计人员和程序员提供编程标准。
本规范为软件测试人员和软件品质保证人员提供工作依据。
本规范的 第 00 次修改
第 1 页 共 24 页
广西南博国际信息有限公司 编程规范
语言类型修饰(小写字母),如C语言
主体使用一个或多个单词表示变量代表的确切含义,参见下面的大小写规则
每个单词的首字符大写, 其余小写,不用下划线“_”。 宏定义和常量全要用大写 不要在代码中直接使用常量(包括字符串常量、数字常量),应使用宏,并在程序文件头部或 h 头部定义。
2.3 自定义的函数、过程名命名规则
每个单词的首字符大写,其余小写,不用下划线“_”,数据库对象除外。
进行一个动作的函数、过程在名称前加上表示动作的动词为前缀,如GetCustInfo。
2.4 数据库对象命名规则
数据库对象(表名,字段等)全用大写;
数据库前缀为……;
第 01 版 第 00 次修改
第 2 页 共 24 页
广西南博国际信息有限公司 编程规范 3 编程风格规定
1) 必须有例外处理;
2) 采用编译指令打印调试信息;
3) 采用公共函数进行信息输出;
4) 信息可以分信息、警告、出错三种;
5) 程序中用到的非调试信息常量必须预先定义;
6) 严格防止越界
对数组和缓冲区进行检查,防止越界,尤其是变长的情况下。 你申请多少空间,就只能用多少。越界使用往往是造成程序无故突然退出的祸首,也是各
种安全漏洞的根源。
尽量使用指定长度的函数,防止越界问题的发生。
7) 调试和测试
代码静态检查 语句覆盖 使用TRACE,ASSERT,VERIFY
8) GOTO语句
如无特殊需要,不得使用GOTO语句;杜绝GOTO语句的嵌套。
9) 缩进
应采用分层缩进格式,以增强源程序的易读性和清晰度。
10) 注释
为了提高可读性,在源程序中带有注释的行一般不得少于总行数的 1/4 。注释应采用中文或中西
文混合。
11) 头文件的书写规范
头文件中尽量不要包含别的头文件
头文件中应使用条件编译来保证该文件不被重复include
12) 其他注意事项
程序中不应直接引用任何实体的物理名,例如物理的路径名、文件名、设备名、表名等。
应通过诸如环境变量、参数文件、缺省
目录
工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录
等途径, 来有效地保证程序的物理独立性。
程序中不应包含可变动数据及安全数据,例如用户的密码(Password)等。
第 01 版 第 00 次修改
第 3 页 共 24 页
广西南博国际信息有限公司 编程规范 4 编程规范(C/C++语言)
4.1 排 版
Rule1-01:程序块一定要采用缩进风格编写,缩进空格数为4。
说明:对于由开发工具自动生成的代码可以有不一致。
Rule1-02:相对独立的程序块之间、变量说明之后必须加空行。
Rule1-03:较长的语句(>80字符)要分成多行书写,较长的表达式要在低优先级操作符处划分新行,操作符放
在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
Rule1-04:循环、判断等语句中若有较长的表达式或语句,则要进行适当的划分。
Rule1-05:若函数或过程中的参数列表较长,则要进行适当的划分。
Rule1-06:不允许把多个短语句写在一行中,即一行只能写一条语句。
Rule1-07:if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行
语句部分无论多短,都要加{}。
Rule1-08:对齐只能使用空格键,不要使用TAB键。
说明:以避免不同的编辑器阅读程序时,因TAB键所设置的空格数目不同造成布局不整齐,不要使用BC作为
编辑器合版本,因为BC会自动将8个空格变为一个TAB键,因此使用BC合入的版本大多会将缩进变乱。
Rule1-09:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的
情况处理语句也要遵从语句的缩进要求。
Rule1-10:程序块的分界符(如C/C++语言的大括号{和})应各独占一行,并且位于同一列。同时与引用它们的
语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、case、
switch语句中的程序都要采用如上的缩进方式。
Rule1-11:在两个以上的关键词、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加
空格;进行非对等操作时,如果是关系密切的立即操作符(如->)后不应加空格。
说明:采用这种松散方式编写的代码的目的是使代码更加清晰。
由于留空格所产生的清晰性是相对的。所以在已经非常清晰的语句中没有必要再留空格。如果语句已经足够
第 01 版 第 00 次修改
第 4 页 共 24 页
广西南博国际信息有限公司 编程规范 清晰,则括号pid;
(5) if、for、while、switch等后面的括号间应加空格,使if等关键词更为突出、明显。
if (a >=b && c > d)
建议1-01:一行程序以小于80字符为宜,不要写的过长。
第 01 版 第 00 次修改
第 5 页 共 24 页
广西南博国际信息有限公司 编程规范
4.2
Rule2-01:一般情况下,源程序有效注释必须在20%以上。
说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。
Rule2-02:说明性文件(如头文件.h、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列
出:版权说明、版本号、生成日期、作者、: myFile.h
Author : Panfengwen
Version : 1.0.1
Date : 2001.10.10
Description : //用于详细说明此文件完成的功能。
Others : //与其它//主要函数列表,每条记录应包括函数名及功能简要说明
1(
2(
History : //修改历史记录列表,每条修改记录应包括修改日期、修改者及修改 第 00 次修改
第 6 页 共 24 页 注 释 ------ ------- Date: …….
广西南博国际信息有限公司 编程规范
File Name : myFile.c
Author : Panfengwen
Version : 1.0.1
Date : 2001.10.10
Description: : //用于详细说明此文件完成的功能。
Others : //与其它//主要函数列表,每条记录应包括函数名及功能简要说明
1. ------
2. -------
History : //修改历史记录列表,每条修改记录应包括修改日期、修改者及修改Date:
Author:
Modification:
2. …….
*******************************************************/
Rule2-04:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。
示例:下面这段函数的注释比较标准。当然,并不局限于此格式,但上述信息建议要包含在 : //函数名称
Description : //函数功能、性能等的描述。
Calls : //本函数调用的函数
清单
安全隐患排查清单下载最新工程量清单计量规则下载程序清单下载家私清单下载送货清单下载
Called by : //调用本函数的函数清单
Table Accessed : //被访问的表(此项仅对于牵扯到数据库操作的程序)
Table Updated : //被修改的表(此项仅对于牵扯到数据库操作的程序)
Input : //输入参数说明
Output : //输出参数的说明
Return : //函数返回值的说明
Others : //其它说明
********************************************************/
Rule2-05:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。
不再有用的注释一定要删除。
第 01 版 第 00 次修改
第 7 页 共 24 页
广西南博国际信息有限公司 编程规范
Rule2-06:注释的 第 00 次修改
第 8 页 共 24 页
广西南博国际信息有限公司 编程规范
建议2-02:通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的 说明:清晰准确的函数、变量等的命名,可增加代码的可读性,并减少不必要的注释。
建议2-03:在代码的功能、意图层次上进行注释,提供有用、额外的信息。
说明:注释的目的使解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没有必要的重复注释信息:
如:下面的注释意义不大。
/* if receive_flag is TRUE */
If (receive_flag)
{
}
建议2-04:在程序块的结束行右方加注释标记,以表明某程序块的结束。
说明:当代码较长,特别是多重嵌套时,这样做可以使代码更清晰,更便于阅读。
建议2-05:注释的格式尽量统一,建议使用 /* -------- */。
建议2-06:注释应考虑程序的易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。
说明:注释语言的不统一,影响程序易读性和外观排版,出于对维护人员的考虑,建议使用中文。
第 01 版 第 00 次修改
第 9 页 共 24 页
广西南博国际信息有限公司 编程规范
4.3
Rule3-01:标识符的命名要清晰、明了,有明确的含义,同时使用完整的单词或大家基本可以理解的缩写,
避免使人产生误解。
说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩
写;有大家公认的缩写的就使用公认的缩写。
Rule3-02:命名中若使用特殊约定或缩写,则要有注释说明。
说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。
Rule3-03:自己特有的命名风格,要自始至终保持一致,不可来回变化。
说明:个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可以使用。
Rule3-04:对于变量命名,禁止取单个字符(如i、j、k…),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k等做局部变量是允许的。
说明:变量,尤其是局部变量,如果用单个字符,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误花费大量的查错时间。
Rule3-05:命名规范必须与所使用的系统风格保持一致,并在同一项目中统一。比如可采用UNIX的全小写加下划线的风格或者大小写混排的方式。不要使用大小写与下划线混排的方式。用作特殊标识如标识成员变量或全局变量的m_和g_,其后加上大小写混排的方式是允许的。
如: Add_User在UNIX下不允许。add_user、AddUser、m_AddUser允许。
建议3-01: 除非必要,不要使用数字或较奇怪的字符来定义标识符。
建议3-02: 在同一软件产品 第 00 次修改
第 10 页 共 24 页 标识符命名
广西南博国际信息有限公司 编程规范
4.4
可读性
Rule4-01:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。
Rule4-02:避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者有物理意义的常量,不应直接使用数字,必须使用有意义的枚举或宏来代替。
如: #define S_OK 0
建议4-01:源程序中关系较为紧密的代码应尽可能相邻。
说明:便于程序的阅读和查找。
建议4-02:不要使用难懂的技巧性很高的语句,除非很有必要。
说明:高技巧性语句不等于高效率的程序,实际上程序的效率关键在于算法。
4.5
Rule5-01:去掉没有必要的公共变量。
说明:公共变量是增大模块间耦合的原因之一。故在必要的情况下,尽量减少没有必要的
公共变量以降低模块间的耦合度。
Rule5-02:仔细定义并明确公共变量的含义、作用、取值范围以及公共变量间的关系。
说明:在对变量声明的同时,应对其含义、作用、取值范围进行注释说明,同时,若有必要还应说明与其它变量的关系。
Rule5-03:明确公共变量与操作此公共变量的函数或过程的关系。如访问、修改或创建等。
说明:明确过程或函数操作变量的关系后,将有利于程序的进一步优化、单元测试、系统联调以及代码维护等。这种关系的说明可在注释或文档中描述。
Rule5-04:当向公共变量传递数据时,要十分小心,防止不合理的值或越界等现象的发生。
说明:对公共变量赋值时,若有必要,应进行合法性检查,以提高代码的可靠性、稳定性。
Rule5-05:防止局部变量与公共变量同名。
说明:若使用较好的命名规则,则此问题可自动消除。
第 01 版 第 00 次修改
第 11 页 共 24 页 变量、结构
广西南博国际信息有限公司 编程规范
Rule5-06:严禁使用未经初始化的变量作为右值。
说明:特别是C/C++中引用未经赋值的指针,经常会引起系统崩溃。
建议5-01:构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象。
说明:降低公共变量的耦合度。
建议5-02:使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量。 说明:使用标准的数据类型,有利于程序的移植。
建议5-03:结构的功能要单一,是针对一种事务的抽象。
说明:设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。结构中的各元素应代表同一事务的不同侧,而不应该把描述没有关系或关系很弱的不同事务的元素放到同一个结构中。
建议5-04:不要设计面面俱到、非常灵活的数据结构。
说明:面面俱到、非常灵活的数据结构反而容易引起误解和操作困难。
建议5-05:不同结构间的关系不要过于复杂。
说明:若两个结构间关系较复杂、密切,那么应该合为一个结构。
建议5-06:结构中元素的个数应适中,若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数。
说明:增加结构的可理解性、可操作性和可维护性。
建议5-07:仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用的现象。
说明:合理排列结构中元素的顺序,可节省空间并增加可理解性。
如:如下的结构中的元素排列较差,将占用较大的空间,可读性也差。
typedef struct EXAMPLE_STRU
{
unsigned int valid:1;
PERSON person;
Unsigned int set_flg:1;
}
若改成如下形式,不仅可以节省1字节的空间,可读性也变好了。
第 01 版 第 00 次修改
第 12 页 共 24 页
广西南博国际信息有限公司 编程规范
typedef struct EXAMPLE_STRU
{
unsigned int valid:1;
unsigned int set_flg:1;
PERSON person;
}
建议5-08:结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。
建议5-09:留心具体语言及编译器处理不同数据类型的原则及有关细节。
说明:如在C语言中,static 局部变量将在 //多数编译器不产生警告, 但此时exam=0xFFFF!!!!
建议5-12:尽量减少没有必要的数据类型默认转换与强制转换。
建议5-13:合理地设计变量并使用自定义数据类型,避免变量间进行不必要的类型转换。
建议5-14:对自定义数据类型进行恰当的命名,使它成为自描述性的,以提高代码的可读性。注意其命名方式在同一个产品中的统一。
说明:使用自定义类型,可以弥补编程语言提供的类型少、信息量不足的缺点,并能使程序清晰、简洁。
建议5-15:当声明用于分布式环境或不同CPU间通信环境的数据结构时,必须考虑机器的字节顺序、使用的位域及字节对齐等问题。
第 01 版 第 00 次修改
第 13 页 共 24 页
广西南博国际信息有限公司 编程规范
说明:比如Intel CPU和68360 CPU,在处理位域及整数时,其在 第 00 次修改
第 14 页 共 24 页
广西南博国际信息有限公司 编程规范
建议6-06:函数的功能应该是可以预测的,也就是说只要输入资料相同,就应该产生同样的输出。
说明:指针参数除外。
建议6-07:尽量不要编写依赖于其它函数 第 00 次修改
第 15 页 共 24 页
广西南博国际信息有限公司 编程规范
建议6-17:让函数在调用点显得易懂、容易理解。
建议6-18:在调用函数填写参数时,应尽量减少没有必要的默认的资料转换或强制转换。
说明:因为数据类型转换或多或少地存在危险。
建议6-19:避免函数中不必要的语句,防止程序中的垃圾代码。
建议6-20:防止把没有关联的语句放到一个函数中。
说明:目的是防止函数或过程 第 00 次修改
第 16 页 共 24 页
广西南博国际信息有限公司 编程规范
(5) 降低函数间接口的复杂度;
(6) 不同层次的函数调用要有较合理的扇入、扇出;
(7) 函数的功能应可预测;
(8) 提高函数的TheReceiveBuffer[FirstSocket].byDataPtr
4.7
Rule7-01:用宏定义表达式时,要使用完备的括号。
示例:如下的宏定义都存在一定的危险。
#define RECTANGLE_AREA(a, b) a*b
#define RECTANGLE_AREA(a, b) (a*b)
#define RECTANGLE_AREA(a, b) (a)*(b)
正确的定义方式是:
#define RECTANGLE_AREA(a, b) ( (a)*(b) )
Rule7-02:将宏所定义的多条表达式放在大括号中。
示例:如下面的语句中只有宏的第一条语句被执行。
#define INIT_RECT_VALUE(a, b) \
a = 0; \
b = 0;
第 01 版 第 00 次修改
第 17 页 共 24 页 宏
广西南博国际信息有限公司 编程规范
for (int j = 0; j < 10; j++)
{
INIT_RECT_VALUE(j, j);
}
正确的方式是:
#define INIT_RECT_VALUE(a, b) \
{\
a = 0; \
b = 0; \
}
Rule7-03:使用宏时,不允许参数发生变化。
示例:如下用法可导致错误。
#define SQUARE(a) ( (a) * (a) )
int a = 5;
int b;
b = SQUARE( a++ ); // 结果:a = 7, 即执行了两次增1。
正确的用法是:
b = SQUARE( a );
a ++; //结果:a = 6,即只执行了一次。
第 01 版 第 00 次修改
第 18 页 共 24 页
广西南博国际信息有限公司 编程规范
4.8
Rule9-01:编程时,要经常注意代码的效率。
说明:代码的效率分为全局效率、局部效率、时间效率和空间效率。全局效率是从整个系统的角度考虑的系统效率;局部效率是站在模块或函数的角度上的效率;时间效率是程序处理输入任务所需要的时间长短;空间效率是程序所需 第 00 次修改
第 19 页 共 24 页 程序效率
广西南博国际信息有限公司 编程规范
来提高空间效率。
说明:这种方式可以对提高空间效率起到一定作用,但往往不能解决根本问题。
建议9-08:在多重循环中,应将最忙的循环放在最< 100; row++)
{
for ( col = 0; col < 5; col++)
{
sum += a[row][col];
}
}
应该把col 和 row 循环变换一下,就可以提高效率。
建议9-09:尽量减少循环嵌套层次。
建议9-10:避免循环体PAI 3.1415926
redius = circle_length /(2*PAI);
应该把如下的浮点除法改为浮点乘法:
#define PAI_RE (1/3.1415926) /* 编译时,将生成具体的浮点数 */
redius = circle_length /2 ;
建议9-12:不要一味追求紧凑的代码。
说明:因为紧凑的代码并不代表高效的机器码。
第 01 版 第 00 次修改
第 20 页 共 24 页
广西南博国际信息有限公司 编程规范
4.9
Rule10-01:在软件设计过程中,构筑软件的质量。
Rule10-02:代码质量保证优先原则:
(1) 正确性,指程序要实现设计要求的功能;
(2) 稳定性、安全性,指程序稳定、可靠、安全;
(3) 可测性,指程序要具有良好的可测试性;
(4) 规范/可读性,指程序书写风格、命名规则等要符合规范;
(5) 全局效率,指软件系统的整体效率;
(6) 局部效率,指某个模块/子模块/函数本身的效率;
(7) 个人表达式/个人方便性,指个人的编程习惯。
Rule10-03:只引用属于自己的存储空间。
说明:如果模块封装的较好,一般不会发生非法引用他人的空间。
Rule10-04:防止使用已经释放的 第 00 次修改
第 21 页 共 24 页 质量保证
广西南博国际信息有限公司 编程规范
Rule10-11:严禁随意更改其它模块或系统的有关设置和配置。
说明:编程时,不能随心所欲地更改不属于自己模块的有关设置,如常量、数组的大小等。
Rule10-12:不能随意改变与其它模块的接口。
Rule10-13:充分了解的系统的接口之后,才能使用系统提供的功能。
Rule10-14:编程时,要防止差1的错误。
说明:此类错误一般是把“<=”误写成“<”或把“>=”写成“>”等等造成的。由此引起的后果,很多情况下是很严重的。所以编程时,一定要在这些地方小心。当变完程序后,应读这些操作符进行彻底的检查。
Rule10-15:要时刻注意容易混淆的操作符。当变完程序后,应从头到尾检查一遍这些操作符,以防止拼写错误。
说明:形式相近的操作符很容易引起误用,如C/C++中的“=”与“==”、“|”与“||”、“&” 与“&&”等,若拼写错了,编译器不一定能够检查出来。
Rule10-16:有可能的话,if语句尽量加上else分支,对没有else分支的语句要小心对待;switch语句必须有default分支。
Rule10-17:在UNIX下,多线程中的子线程退出必须采用主动退出方式,即采用return出口。
Rule10-18:不要滥用goto语句。
建议10-01:不要使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的可移植性和可重用性。
建议10-02:除非为了满足特殊需要,避免使用嵌入式汇编。
说明:程序中嵌入汇编,一般对程序的可移植性有较大的影响。
建议10-03:精心地构造、划分子模块,并按“接口”部分和“ 第 00 次修改
第 22 页 共 24 页
广西南博国际信息有限公司 编程规范
建议10-05:对较关键的算法最好使用其它算法来确认。
建议10-06:时刻注意表达式是否会上溢、下溢。
示例:如下程序将造成变量的下溢。
unsigned char size;
while( size-- >= 0)
{
/* Do your work*/
}
注意:当size 等于0时,在减1不会小于0,而是0xFF,故上面的程序使一个死循环。应把size
改为如下: char size; //从 unsigned char 改为char。
建议10-07:使用变量时,要注意其边界值的情况。
建议10-08:留心程序机器码的大小(如指令空间大小、数据空间大小、堆栈空间大小等)是否超出系统的有关限制。
建议10-09:为用户提供良好的接口界面,使用户能充分地了解系统 第 00 次修改
第 23 页 共 24 页
广西南博国际信息有限公司 编程规范 5 本开发团队的一些规范说明
5.1 注释
多做注释
Rule11-01:对每个类每个函数,要有必要的注释说明,如功能、参数意义、返回值;
Rule11-02:对函数、方法 第 00 次修改
第 24 页 共 24 页