盛大网络软件开发规范Word文档下载推荐.docx
- 文档编号:18730339
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:23
- 大小:45.82KB
盛大网络软件开发规范Word文档下载推荐.docx
《盛大网络软件开发规范Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《盛大网络软件开发规范Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
3.3结构9
3.4函数9
3.5类9
3.6类数据成员9
3.7静态变量9
3.8全局变量10
4其他约定10
4.1常量、宏10
4.2变量10
4.3函数11
4.4可测性11
4.5程序效率11
4.6质量保证11
4.7代码编译12
4.8代码测试、维护12
1文件结构
C++程序的头文件以“.h”为后缀,C++程序的定义文件以“.cpp”为后缀。
1.1版权和版本的声明
版权和版本的声明位于头文件和定义文件的开头(参见示例1-1),主要内容有:
1.版权信息。
2.文件名称,标识符,摘要。
3.当前版本号,作者/修改者,完成日期。
4.版本历史信息。
/*
*Copyright(c)2003,上海盛大网络研发中心
*Allrightsreserved.
*
*文件名称:
filename.h
*摘要:
简要描述本文件的内容
*当前版本:
1.1
*修改内容:
*作者:
输入作者(或修改者)名字
*完成日期:
2003年x月xx日
*
*取代版本:
1.0
*原作者:
输入原作者(或修改者)名字
*/
示例1.1版权和版本的声明
1.2头文件(.h)的结构
头文件由三部分内容组成:
1.头文件开头处的版权和版本声明(参见示例1-1)。
2.预处理块。
3.函数和类结构声明等。
假设头文件名称为graphics.h,头文件的结构参见示例1-2。
//版权和版本声明见示例1-1,此处省略。
#ifndefGRAPHICS_H//防止graphics.h被重复引用
#defineGRAPHICS_H
#include<
math.h>
//引用标准库的头文件
…
#include“myheader.h”//引用非标准库的头文件
voidFunction1(…);
//全局函数声明
classCBox//类结构声明
{
};
#endif
示例1-2C++/C头文件的结构
1.3定义文件(.cpp)的结构
定义文件有三部分内容:
1.定义文件开头处的版权和版本声明(参见示例1-1)。
2.对一些头文件的引用。
3.程序的实现体(包括数据和代码)。
假设定义文件的名称为graphics.cpp,定义文件的结构参见示例1-3。
#include“graphics.h”//引用头文件
//全局函数的实现体
voidFunction1(…)
}
//类成员函数的实现体
voidCBox:
:
Draw(…)
1.4目录结构
如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。
例如可将头文件保存于include目录,将定义文件保存于source目录(可以是多级目录)。
2程序的版式
2.1缩进
●程序块要采用缩进风格编写,缩进为4个空格;
如使用Tab缩进,请把Tab的大小设为4个字符长。
2.2空行
●在每个类声明之后、每个函数定义结束之后都要加空行。
参见示例2-1(a)
●在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
参见示例2-1(b)
//空行
voidFunction2(…)
voidFunction3(…)
while(condition)
statement1;
//空行
if(condition)
{
statement2;
}
else
statement3;
}
statement4;
示例2-1(a)函数之间的空行示例2-1(b)函数内部的空行
2.3代码行
●一行代码只做一件事情,如定义变量,或只写一条语句。
这样的代码容易阅读,并且方便于写注释。
●if、for、while、do等语句自占一行,执行语句不得紧跟其后。
不论执行语句有多少都要加{}。
这样可以防止书写失误。
示例2-2(a)为风格良好的代码行,示例2-2(b)为风格不良的代码行。
x=a+b;
y=c+d;
z=e+f;
y=c+d;
z=e+f;
if(width<
height)
dosomething();
height)dosomething();
for(initialization;
condition;
update)
other();
dosomething();
示例2-2(a)风格良好的代码行示例2-2(b)风格不良的代码行
●尽可能在定义变量的同时初始化该变量(就近原则)
如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。
如果引用了未被初始化的变量,可能会导致程序错误。
本建议可以减少隐患。
例如:
intnWidth=10;
//定义并初绐化width
intnHeight=10;
//定义并初绐化height
intnDepth=10;
//定义并初绐化depth
2.4代码行内的空格
●关键字之后要留空格。
象const、virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字。
象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
●函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
●‘(’向后紧跟,‘)’、‘,’、‘;
’向前紧跟,紧跟处不留空格。
●‘,’之后要留空格,如Function(x,y,z)。
如果‘;
’不是一行的结束符号,其后要留空格,如for(initialization;
update)。
●赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>
=”、“<
=”、“+”、“*”、“%”、“&
&
”、“||”、“<
<
”,“^”等二元操作符的前后应当加空格。
●一元操作符如“!
”、“~”、“++”、“--”、“&
”(地址运算符)等前后不加空格。
●象“[]”、“.”、“->
”这类操作符前后不加空格。
●对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for(i=0;
i<
10;
i++)和if((a<
=b)&
(c<
=d))
voidFunc1(intx,inty,intz);
//良好的风格
voidFunc1(intx,inty,intz);
//不良的风格
if(year>
=2000)//良好的风格
if(year>
=2000)//不良的风格
if((a>
=d))//良好的风格
if(a>
=b&
c<
=d)//不良的风格
for(i=0;
i++)//良好的风格
for(i=0;
i<
i++)//不良的风格
for(i=0;
i<
10;
i++)//过多的空格
x=a<
b?
a:
b;
x=a<
b?
a:
b;
//不好的风格
int*x=&
y;
//良好的风格
int*x=&
y;
//不良的风格
array[5]=0;
//不要写成array[5]=0;
a.Function();
//不要写成a.Function();
b->
Function();
//不要写成b->
Function();
示例2-3代码行内的空格
2.5对齐
●程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
●{}之内的代码块在‘{’右边数格处左对齐。
示例2-4(a)为风格良好的对齐,示例2-4(b)为风格不良的对齐。
voidFunction(intx)
…//programcode
voidFunction(intx){
if(condition)
else
if(condition){
else{
update){
while(condition){
如果出现嵌套的{},则使用缩进对齐,如:
…
…
示例2-4(a)风格良好的对齐示例2-4(b)风格不良的对齐
2.6长行拆分
●代码行最大长度宜控制在70至80个字符以内。
代码行不要过长,否则不便于阅读。
●长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。
拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
if((very_longer_variable1>
=very_longer_variable12)
(very_longer_variable3<
=very_longer_variable14)
(very_longer_variable5<
=very_longer_variable16))
virtualCMatrixCMultiplyMatrix(CMatrixleftMatrix,
CMatrixrightMatrix);
for(very_longer_initialization;
very_longer_condition;
very_longer_update)
示例2-5长行的拆分
2.7注释
C++语言中,程序块的注释常采用“/*…*/”,行注释一般采用“//…”。
注释通常用于:
1.版本、版权声明;
2.函数接口说明;
3.重要的代码行或段落提示。
虽然注释有助于理解代码,但注意不可过多地使用注释。
参见示例2-6。
●注释是对代码的“提示”,而不是文档。
程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱。
注释的花样要少。
●如果代码本来就是清楚的,则不必加注释。
否则多此一举,令人厌烦。
例如
i++;
//i加1,多余的注释
●边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。
不再有用的注释要删除。
●出于对维护人员的考虑,建议使用中文注释。
●注释应当准确、易懂,防止注释有二义性。
错误的注释不但无益反而有害。
●尽量避免在注释中使用缩写,特别是不常用缩写。
●注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。
●注释与所描述内容进行同样的缩排。
●当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。
*函数名称:
*函数介绍:
*输入参数:
*输出参数:
*返回值:
voidFunction(floatx,floaty,floatz)
if(…)
while(…)
}//endofwhile
}//endofif
示例2-6程序的注释
2.8修饰符的位置
●将修饰符*和&紧靠变量名
char*name;
int*x,y;
//此处y不会被误解为指针
2.9类的版式
类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。
类提供关键字public、protected和private,分别用于声明哪些数据和函数是公有的、受保护的或者是私有的。
这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。
类的版式需要按以下方式设计:
将public类型的成员写在前面,而将private类型的成员写在后面。
将public类型的成员函数和成员变量分段排布,并且将public类型的成员函数放在最前面。
参见示例2-7。
classCTest
public:
voidFunc1(void);
voidFunc2(void);
intm_iHeight;
private:
floatm_fLen;
示例2-7
3配合Doxygen的注释规范
为了配合自动文档生成的需要,按照下面的规范注释代码。
上文中所涉及的注释可以做相应调整。
3.1版权和版本的声明
/**@filefunc.cpp@brief文件的简洁描述。
<
pre>
func.cpp
/pre>
*/
注意第一行的“/*”后需要紧跟一个“*”,这是Doxygen的识别标志。
@file和@brief也是Doxygen的识别标志,其中@file指明需要注释的文件的名称,@brief指明文件的简要注释。
第一行和最后一行的内容一定要保持为单独的一行。
3.2全局对象的注释
为了注释一个全局的对象(functions、typedef、enum、macros等等),必须先注释包含它们的文件。
如果只给出简要注释,则注释以“///”开始,且只能有一行。
如果需要给出简要注释和详细注释,则两者需要以空行分隔,并且简要注释需要在前面添加“@brief”。
/**
@briefAmacrothatreturnsthemaximumof\aaand\ab
详细注释。
#defineMAX(a,b)(((a)>
(b))?
(a):
(b))
@briefAtypedefinitionfora
类型定义的详细注释。
typedefunsignedintUINT32;
全局变量的详细注释
全局变量的另一行详细注释
interrno;
///全局函数的简洁注释
intread(int,char*,size_t);
全局函数的详细注释
return3;
3.3类的注释
类的注释放在类声明的前面。
注释包括简要注释和详细注释,两者需要以空行分隔,并且简要注释需要在前面添加“@brief”。
@brief简要注释!
Testclass。
详细注释!
DetailsaboutTest。
classTest
3.4类成员变量的注释
类成员变量的注释放在类的声明中,有两种注释方法,一种是将注释放在成员变量的前面,以“///”开始,另一种是将注释放在成员变量的右侧,以“///<
”打头。
///第一种方式:
成员变量a
inta;
intb;
///<
第二种方式:
成员变量b
…
3.5类成员函数的注释
类成员函数的注释包括简要注释和详细注释,其中简要注释在声明的时候给出,而详细注释在定义的时候给出。
简要注释一般为单行注释,且以“///”打头,而详细注释则是对函数的具体描述,其中包括对参数、异常和返回值等的描述,以“/**”开始:
简洁注释:
public:
///简要注释
constchar*member(char,int)throw(std:
out_of_range);
详细注释:
这里是详细注释!
继续详细注释!
@paramcacharacter.
@paramnaninteger.
@exceptionstd:
out_of_rangeparameterisoutofrange.
@returnacharacterpointer.
constchar*Test:
member(charc,intn)throw(std:
out_of_range)
其中“@param”指明函数的参数,后面紧跟着的是参数的名称和解释;
“@exception”指明函数会抛出的异常,后面紧跟异常的名称和描述;
“@return”指明函数的返回值,后面紧跟对返回值的描述。
3.6结构体的注释
对于结构体的注释,类似于对类的注释。
其中关于结构体的注释放在声明的前面,简要注释和详细注释以空行进行分隔,且简要注释需要以“@brief”标示;
对于其中成员的注释只给出简要注释,可以放在声明的前面或右侧,放在前面的注释以“///”开始,放在后面的注释以“///<
”开始。
@brief结构体的简要注释
结构体的详细注释
structCoordStruct
///x坐标
floatx;
floaty;
y坐标
3.7枚举类型的注释
对于枚举类型的注释应放在定义的前面,如果只给出简要注释,则以“///”开始,如果有详细描述,则以“/**…*/”标示;
对于枚举类型中各个成员的注释应放在隔成员的右侧或前面,放在右侧的注释以“///<
”开始,放在前面的注释以“///”开始。
/**
@brief枚举类型的简要注释
枚举类型的详细注释
enumAnotherEnum
{
V1,///<
value1
V2///<
value2
};
3.8重载函数的注释
对于重载的函数需要在其详细注释的开始添加“@overload”,并在“@overload”的下一行开始添加详细注释。
@overload
重载函数的详细注释
...
member(chara,charb)
3.9其它
在不违背上述约定的情况下,可参考Doxygen手册,增加额外的辅助注释。
4命名规则
命名规则一般采用“匈牙利命名”法。
4.1简单变量
简单变量的命名方法:
前缀+X。
Prefix
Type
b
bool
by
Byte
c
char
dw
DWORD
e
enum
dbl
double
h
HANDLE
n
int
l
long
p
pointer
psz
char*字符串的末尾为’\0’
w
WORD
其中“X”的命名要做到望文知意,最好采用首字母大写的英文单词或其组合,组合方式为“名词”或者“形容词+名词”。
例如:
intnCurrentValue;
char*pszName;
一些局部变量可遵循简单命名规则,如for、while循环中的自增变量可命名为i、j、k等。
for(inti=1;
i++)
4.2常量
常量全用大写的字母,用下划线分割单词。
constintMAX=100;
constintMAX_LENGTH=100;
4.3结构
结构名称必须全用大写,例如
typedefstruct
……
}USER,*PUSER;
4.4函数
函数名采用首字母大写的英文单词或其组合,组合方式为“动词”或者“动词+名词”(动宾词组)。
类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身,如:
DrawBox();
pBox->
Draw();
//类的成员函数
4.5类
类的名称必须用C打头,后跟首字母大写的英文单词或其组合,例如
classCBox
4.6类数据成员
规则:
m_XXXX
4.7静态变量
静态变量加前缀s_(表示static),例如:
voidInit(…)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 盛大网络 软件 开发 规范