海马的软件开发规范
海马的软件开发规范
网友海马把他的编码规范提供出来,我认为应该让大家也学习一下,就贴了出来如果网友海马不同意我会马上删除此文档。
源程序命名规定
1)总则:
文件名全部用小写字母。
源文件后缀为.c或.cpp
头文件后缀为.h。
2)为了清楚地区分各个子模块、子系统,建议使用以下标识作为源文件的前缀:
子模块:
sms_ 公共文件
com_ 通讯部分
uim_ 用户届面
dba_ 数据库访问
test_ 测试程序
通讯模块中的子部分:
prc_ 进程内调度机制
dlg_ 会话与事务机制
cfg_ 可配置机制和配置中心子系统
wrk_ 监视告警日志机制
db_ 数据库代理子系统
log_ 日志子系统
mon_ 监视子系统
warn_ 告警子系统
3)文件头部声明格式
文件名 : 文件名 (eg:ADD.c)
作者 : 作者姓名 (eg:牛顿)
日期 : 该文件创建日期 (eg:2000/8/1)
文件功能 : 该文件所能实现的功能 (eg:One of the source files for the class CEdit)
版本 : 版本号 (eg:1.0)
编译环境 : (eg:VC++6.0,GNU)
实现环境 : (eg:Windows98,Helio 3.2)
注释 : 对文件的附加说明(包括那些函数和全局变量)
修改者姓名 (eg:爱因斯坦) 修改时间 (eg:2000/9/1) 对所修改内容的详述
...
版权声明 : ---------------------------------------------
(eg: Copyright (c) 2000 MicroSoft .All rights reserved. )
五.类和变量的规定
1) 尽可能为每个类创建两个文件(.c和.h文件)。可以采用前缀加上类名的方法构成一文件名。不要怕文件名太长。 为每个类单建文件,是为了维护的方便,便于查找、修改,跟据类名可以直接找到文件名。 可以将数目不多、代码量不大的密切相关的几个类放在一对.h/.c文件中。公用类是可以放在一起的。
2) 类(自己定义的)的名字以大写的 C 开头。
结构的名字以 St 开头。
枚举类型的名字以 En 开头。
联合的名字以 Un 开头。
自定义的简单数据类型以 T 开头。
这些前缀后面跟以大写字母开头的单词。
3) 对变量的声明:
变量的名字以能够反映该变量类型或性质的一个或多个小写字母开头(根据匈牙利规则 ; 匈牙利规则----变量类型由一个或两个字符表示. )
一些常用的表示如下:
-----------------------------------------
前缀 ¦ 数据类型
-----------------------------------------
c ¦ char
d ¦ double
s ¦ string
i ¦ integer
l ¦ long
x,y ¦ integer,long(分别用作x,y座标时)
cx,cy ¦ integer,long(分别用作x,y长度时)
b ¦ BOOL
p ¦ 指针
---------------------------------------------
4) 函数(类成员函数可以出外)和宏定义,注释:
函数的名字以大写单词开头,采用大小单词混写的方式,可以使用常用的缩写不使用小写字母加下划线的方式。 函数的命名要表明它的作用,不要怕名字长. 例:GetMaxLength(); 除非是在函数体内部,不得使用原始的简单数据类型,应该为各种类型的数据定义有意义的能够反映该数据的特征的数据类型。
函数的参数类型应该尽可能使用自定义的类型。
函数的返回值尽可能使用枚举类型,或者使用自定义的类型。
函数头部声明格式:
函数名 : 函数名
日期 : 该函数创建日期
函数功能 : 该函数所能实现的功能
参数说明 : 对函数的输入输出参数、返回值、用到的全局变量加以说明
...
宏定义的名字全部用大写字母。不要试图用宏定义代替函数。宏定义不要太长。注意宏定义时括号的完整性。对于宏定义的常数、表达式等一定要用括号括起来。
对于标志性的值,或者已知几种情况的值,应该使用枚举类型定义有意义的名字或是宏定义,而不是用整型。
编译符号的名字以下划线开头,后面用大写字母和下划线混写。
边写代码边写注释。短小的注解应当具有启发性,对阅读程序有用。如果在写代码时便写注释,而不是所有工作都完了再返回头来加注释,可以避免许多错误。对于在开始时不愿花时间去写长篇的程序头说明和函数描述是可以理解的,但在写代码时加入短小的注解总是有时间的。
5)控件的命名:
原则:控件的Name属性命名既要表明控件类型又要表明用途,常用的约束如下
Name = 控件名(小写前缀)+用途(单词的首字母大写)
***************************************************************
对象 前缀 例子
***************************************************************
Form(窗体) frm frmFileOpen
Label(标签) lbl lblHelpMessage
Frame(框架) frm frmLanguage
CheckBox(复选框) chk chkReadOnly
ComboBox(组合框) cbx cbxEnglish
ListBox(列表框) lst lstPolicyCodes
Timer(定时器) tim timAlarm
Shape(形状(圆,正方形..)) shp shpCircle
Image(图像) img imgIcon
(注:开发人员发现未出现在规范中的控件,应及时向编码规范编写者上报,以确定其规范)
6) 菜单的命名:
主菜单:使用前缀mnu+当前菜单标题 例:File --> mnuFile
子菜单:使用前缀mnu+当前主菜单标题+当前菜单标题
例:File下的Open--->mnuFileOpen
六、编程规则
1)首先要满足软件编程规范总则和数据库分则的要求。
编程人员不得随意更改设计,如有需要,必须通报设计人员,设计人员认可后,才能更改。设计方案中涉及到的类,不得随意定义Public类型的函数,或者更改类函数或成员变量的属性(Public,Protect,Private,Virtual)。
2)全局变量的定义一定要得到设计人员的许可。不得使用简单的全局变量,可以定义少数的全局对象。可以将全局变量放在一个专门的类中,通过函数接口访问变量。
变量(全局,局部)也要初始化。
3)析构函数通常情况下应被声明为虚的,否则,会有不正确地析构了对象的风险。
例如:BaseClass *pB=new ChildClass; ... ; 当delete pB时,如果BaseClass的析构函数不是虚函数,则不会调用ChildClass的析构函数。如果不将析构函数声明为virtual,则要给出注释,指明理由。只要将最早的基类的析构函数指明为virtual即可。
不能用拷贝构造函数代替赋值运算符的重载。如果有一个非缺省构造函数,则必需重定义缺省构造函数。虚函数不能是类的内联(inline)函数。构造函数不能是虚的。赋值运算符的重载必需作为类的成员函数。
4)指针一定要初始化,不得使用未经初始化或没有赋值的指针。使用指针之前要判断其是否为空,释放指针后将指针设置为空。建议不去释放空指针(虽然在有的系统上,释放空指针没有坏的后果)。 指针使用完毕要及时释放。一般来说,在析构函数内,应该做释放内存的工作(释放对象运行中动态分配的内存)。
对于链表,最后一个对象的next指针一定要设置为空。
5)注意数组的越界问题,一定要判断数组的元素个数.对于已知长度的字符串,应该预先定义好数据类型,然后使用该自定义类型,而不要使用char*。为字符串分配空间要注意多一个字节
6)除非是在函数体内部,不得使用原始的简单数据类型。应该为各种类型的数据定义有意义的能够反映该数据的特征的数据类型。
7)函数的返回值尽可能使用枚举类型,或者使用自定义的类型。对于标志性的值,或者已知几种情况的值,应该使用枚举类型定义有意义的名字,而不是用整型。函数的参数类型应该尽可能使用自定义的类型。
8)对数据类型(包括简单数据类型、公共的结构,不包括类)的定义,放在统一的公共文件中(暂定sms_datatype),不得在其它地方定义数据类型。在公共文件sms_datatype中统一定义数据类型的好处是便于修改,同时可以对系统的数据有一个总体认识。
9)不依赖于特定的子系统、可以为多个子系统所用的公共函数的定义,放在公共文件sms_pub.h和sms_pub.c中。
10)对基础类、公用类的定义放在公共文件sms_class.h和sms_class.c中。对于已经在sms_class.h (.c)中实现的类,不得再定义与之相近的类。对于同样的或相近的功能,不得定义多个类。
11)字符串指针作为函数参数时,要注意输入、输出参数的区别。同时注意指针本身是否可以被修改。如果可以修改指针,还要注意是否要重新分配空间。
12)小心使用strcpy,尽可能不用它,可以使用strncpy或memcpy代替(别忘了在目标字符串后加上'