vc规范tmp.docx
《vc规范tmp.docx》由会员分享,可在线阅读,更多相关《vc规范tmp.docx(53页珍藏版)》请在冰豆网上搜索。
vc规范tmp
Revision1.0
版权所有,拷贝必究
Revisionhistory
版本号发行日期说明
1.02000.06.01第一版本根据资料由王红改编
目录
第一部编程基本规约4
第1章命名方法5
1命名原则的设定5
2命名的基本5
3直接数值使用的禁止10
第2章注释10
1各个文件中的注释11
2各个函数的注释11
3数据类型的注释12
4变量及参数的注释13
5关键处理块的注释13
第3章原代码的变更14
1表示变更的注释14
2变更方法15
第4章附录例程序17
1付.h文件的范例17
2付.c文件的范例21
第二部编程指导(一般篇)28
第1章模块化的方法29
1一个函数一个机能29
2一个机能一个函数31
3共通化(generalization)31
4函数的层次32
5函数参数的决定方法33
6函数的大小33
7函数返回处33
第2章错误处理34
1错误的等级34
2错误信息的充实35
3错误处理的优先35
4特别需注意点35
5错误恢复处理36
6多重错误处理37
第3章数据文件38
1排他控制38
2扩张性38
3输入输出的高效率化38
第4章定义40
1一个变量一个用途40
2变量名的略名40
3一个文字的变量名40
4给变量名一个正确的含义41
5资源的定义41
第5章执行文42
1goto文42
2为的副作用42
3优先顺序43
4评价顺序43
5if…else的使用43
6很长的循环45
第6章编出悦目的程序45
1文字缩进45
2列位置的整齐45
3一行的长度46
4一行复数语句的禁止46
第一部编程基本规约
第1章命名方法
命名方法之所以要标准化,主要出于以下几个目的。
1)即使只从名字,也可以判断出起什么作用?
是何种类型?
提高了可读性及可维护性。
2)避免编译及链接时的冲突/不一致,而这种冲突/不一致在把一些模块移到别的一些操作系统中时有可能发生。
3)阅读源程序以及进行调试时,某个符号属于哪一个模块,能很快的明白。
4)和用途直接有关的固有名诩的使用,能够防止由于疏忽而错误地使用于别的用途。
对于变量来说,一个用途一个变量是一个重要的原则。
1命名原则的设定
变量尽量采用匈牙利命名法,同时结合VC的语言原则。
2命名的基本
在源程序中使用的符号(外部变量,结构定义,函数名,宏定义)的名称,应该满足下列条件。
1)根据其名称,可以容易的推断他的用途。
保持名称和含义的一致,以使得从名称上可以容易地推断该符号被使用在什么用途上。
此外由于编程语言的不同,变量定义可以使用的最大的文字个数不同。
应该充分活用有限的字符来命名,不应该吝惜键盘的入力而采取暧昧的简称。
例如:
利用下划线或将每个单词的首字符大写(应尽量少用下划线),区分由复数个单词组成的名称,每个单词应尽量全写。
比如:
●PaintPolygonRegion
●ReplyMessage
●PreviousCursor
●SetMouseAction
2)根据其名称,可以容易地推断它是变量还是宏定义。
在能够使用大小写字符的编程语言中,使用下述方法来加以区别是通常的。
小字符(可以个别是大写字符)
全部大写字符
变量名
函数名
宏定义
变量名,函数名
宏定义名
CreateDate(…)
.ptrMessage
.nWindowSizeX
DF_ACK_REQUIREDX_BM_OVERFLOW_ERRORWM_RIGHT_BUTTON
3)错误码定义
错误处理是在障害容易发生的情况下特别需要注意的必须项目。
因此错误码和其他符号的在命名时应该要注意是否易于区别。
在整个项目的自始至终中要贯彻一致。
例1:
__ERROR
●SCHED_TIMEOUT_ERROR
●MEM_OVERFLOW_ERROR
例2:
ERR_
●ERR_ILLEGAL_CHARACTER
●ERR_OUT_OF_RANGE
4)根据其名称,能够推断出其所属进程及文件
大型的项目基本上是由复数个具备一定规模大小的机能模块而构成的。
就好象通常的OS是由进程调度程序,内存管理程序,文件I/Oetc模块而构成。
这种项目中,各个函数,全局变数,源文件只需根据名称就可以明确地知临危不惧其属于哪能个机能模块或文件。
例如采用下述命名方法。
●文件名:
[执行程序名]例:
DM=目录管理程序,SCHED=调度程序,:
标志文件/模块属性的名称。
例:
INIT=初期化模块,COMM=通信模块,DB=数据库处理模块
●函数名:
_.
●变量名:
_
prefix:
[执行程序名][模块名]。
例:
DM=目录管理程序,SCHED=调度程序,
INIT=初期化模块,COMM=通信模块,DB=数据库处理模块
Identifier:
标志各个函数,变量的特有属性的名称。
变量的identifier的取名法:
字符串变量:
str/buf
全局批针变量:
ptr
整型计数变量:
cnt
布尔变量:
Is/Not
函数名的定义应该使得根据函数名,能够很简单找出相应的源文件,这样维护的时候能够容易的追踪程序的流程。
比较常用的是prefix取和文件同样的名称。
Extension:
标志使用的语言或文件的类型。
“.h”,“cpp”,“.asm”
3变量的命名
一般情况下,变量的取名方式为:
有关项目的全局变量必须用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量。
前缀
类型
例子
g_
GlobalVariable
.g_Servers
C
Classorstructure
CDocument,
CprintInfo
m_
Membervariable
.m_pDoc,
.m_nCustomers
VisualC++常用前缀列表:
前缀
类型
描述
例子
.ch
.char
8-bitcharacter
.chGrade
.ch
TCHAR
16-bitcharacterif_UNICODEisdefined
.chName
.b
BOOL
Booleanvalue
.bEnabled
.n
.int
Integer(sizedependentonoperatingsystem)
.nLength
.n
UINT
Unsignedvalue(sizedependentonoperatingsystem)
.nLength
.w
WORD
16-bitunsignedvalue
.wPos
.l
LONG
32-bitsignedinteger
.lOffset
.dw
DWORD
32-bitunsignedinteger
.dwRange
.p
*
Ambientmemorymodelpointer
.pDoc
.lp
FAR*
Farpointer
.lpDoc
.lpsz
LPSTR
32-bitpointertocharacterstring
.lpszName
.lpsz
LPCSTR
32-bitpointertoconstantcharacterstring
.lpszName
.lpsz
LPCTSTR
32-bitpointertoconstantcharacterstringif_UNICODEisdefined
.lpszName
.h
.handle
HandletoWindowsobject
.hWnd
.lpfn
(*fn)()
.callbackFarpointertoCALLBACKfunction
.lpfnAbort
Windows对象名称缩写:
Windows对象
例子变量
MFC类
例子对象
HWND
hWnd;
CWnd*
pWnd;
HDLG
hDlg;
CDialog*
pDlg;
HDC
hDC;
CDC*
pDC;
HGDIOBJ
HGdiObj;
CGdiObject*
pGdiObj;
HPEN
hPen;
CPen*
pPen;
HBRUSH
hBrush;
CBrush*
pBrush;
HFONT
hFont;
CFont*
pFont;
HBITMAP
HBitmap;
CBitmap*
pBitmap;
HPALETTE
HPalette;
CPalette*
pPalette;
HRGN
hRgn;
CRgn*
pRgn;
HMENU
hMenu;
CMenu*
pMenu;
HWND
hCtl;
CStatic*
pStatic;
HWND
hCtl;
CButton*
pBtn;
HWND
hCtl;
CEdit*
pEdit;
HWND
hCtl;
CListBox*
pListBox;
HWND
hCtl;
CComboBox*
pComboBox;
VisualC++常用宏定义命名列表:
前缀
符号类型
符号例子
范围
IDR_
标识多个资源共享的类型
IDR_MAINFRAME
1to0x6FFF
IDD_
对话框资源(Dialog)
IDD_SPELL_CHECK
1to0x6FFF
HIDD_
基于对话框的上下文帮助(ContextHelp)
HIDD_SPELL_CHECK
0x20001to0x26FF
IDB_
位图资源(Bitmap)
IDB_COMPANY_LOGO
1to0x6FFF
IDC_
光标资源(Cursor)
IDC_PENCIL
1to0x6FFF
IDI_
图标资源(Icon)
IDI_NOTEPAD
1to0x6FFF
ID_
IDM_
工具栏或菜单栏的命令项
ID_TOOLS_SPELLING
0x8000to0xDFFF
HID_
命令上下文帮助(CommandHelpcontext)
HID_TOOLS_SPELLING
0x18000to0x1DFFF
IDP_
消息框提示文字资源
IDP_INVALID_PARTNO
8to0xDFFF
HIDP_
消息框上下文帮助(Message-boxHelpcontext)
HIDP_INVALID_PARTNO
0x30008to0x3DFFF
IDS_
字符串资源(String)
IDS_COPYRIGHT
1to0x7FFF
IDC_
对话框内的控制资源(Control)
IDC_RECALC
8to0xDFFF
4禁止直接使用数值
在程序中直接使用数值的编程方法,绝对禁止使用。
尽量使用宏定义或参数设定文件,其原因如下:
●在将来变更的时候,需要修改源文件,或者比较导致修改比较复杂,而容易产生漏改等错误。
●光从数值上来看的话,不容易明白其含义。
对这种定数命名时,必须采用望其名通其意的名称来宏定义。
在程序中使用该宏定义。
例:
#defineMAX_BUFFER_LEN256
#defineESCAPE_KEY033
#defineBACKSPACE_KEY010
#defineINSERT_MODE1
#defineAPPEND_MODE2
#definePI3.1415926
第2章注释
无论函数也好,数据构造也好,必须相应的注释。
注释的目的,是为了将来软件维护的时候,即使不看源程序,只看注释的内容,也能够充分理解。
注释主要记述以下几个方面的问题:
机能,设计说明,限制事项,边界条件,假定或潜在的问题。
注释不是程序语句的改头换面,而是从更高的一个层次来阐述说明。
注释在下述场所必须追加。
1)所有文件的开头
2)所有函数的开头
3)主要数据结构定义的开头
4)函数内部的变量,和参数的定义处
5)各个函数中关键处理块的开头
1各个文件中的注释
各个文件的开头,下述著作权表示的注释要写。
接着著作权表示的后面,是对这个文件的说明。
/********************************************************************
*版权所有,北京XXX技术开发有限责任公司,1997-2000
*NAME
该文件的文件名,不是全路径名,而是文件短名(即不包含目录)。
*DESCRIPTION
包含复数个函数的时候,要记述为什么要把这些函数整理汇集成一个文件的理由。
*PROJECT
项目的名称
*OS
该项目的所适用的操作系统等软件环境
*DATE
项目的开发日期(本文件作成日期)
*Notes
其他的一些注释说明。
********************************************************************/
2各个函数的注释
各个函数的开头,必须追加对这个函数的说明。
函数说明的格式虽然根据使用的语言而有所不同,但是要包含下述的情况。
特别是注明了“必须”的项目是不能缺少的。
*NAME(必须)
函数名
*FUNCTION(必须)
函数的功能,用简单的名词句来描述函数所完成的功能。
*INPUT(必须)
入力用参数说明
*OUTPUT(必须)
输出用参数说明
*UPDATE(必须)
更新的全局变量的清单及说明。
*RETURN(必须)
函数的返回值以及其含义。
*CALLINGROUTINED
调用该函数的函数清单。
*ROUTINESCALLED
本函数调用函数的清单。
*NOTES
本函数利用的前提条件。
例如:
需要调用初期化函数。
*HISTORY(必须)
变更或版本更新的时候,日期,版本号,变更者名,变更内容。
3数据类型的注释
对于头文件中一些主要的数据结构定义,要说明它是什么样用途的定义,以及如何被使用的。
改变的履历也应该标明。
例:
typedefstruct_JOB_NODE{
intpid;/*ProcessID*/
charjobid[JIDLEN];/*JobID*/
charjobname[JNAMELEN];/*JobName*/
charexecpath[EXECPATHLEN];/*Execpath*/
charexecpara[EXECPARALEN]/*Execparameter*/
characcess[ACCESSIEN];/*Accessmode*/
charkillsig[SIGNALLEN];/*Processkillsignal*/
charstopsig[SIGNALLEN];/*Processstopsignal*/
charusrsig[SIGNALLEN];/*Userdefinesignal*/
}JOB_NODE;
4变量及参数的注释
对于变量及函数的参数,要说明其使用的目的。
5关键处理块的注释
对于关键处理块的说明,要从详细的设计层次来阐述。
而不是简单的程序语言的改头换面,那样只能使注释单调烦琐。
第3章原代码的变更
对软件源代码进行修改的时候,修改部分及其原因,为了让别人能够明白,必须加以一定的注释。
而这种做法的目的有以下的重要意义。
1)错误问题发生的时候,可以帮助快速定位问题的发生点。
2)对于软件的版本更新管理有重要的意义。
1表示变更的注释
对于变更的场所,必须追加满足下述条件的注释。
1)注释要覆盖变更部分的整体范围。
因此,对于每个变更部分的开始和结束,都要追加以下的注释。
/*AddorDeletebeISE/Zhang97.02.19forxxxxxxxxxxxxxxx*/
………………
/*AddorDeleteEnd*/
此种注释,最好对于比较大程度范围的变更比较有效。
在有很多细小的变更的场合,每一行程序都以此种方式进行注释,将使得可视性受到影响。
可以采用以下注释方式。
/*ModifiedbyISE/Zhang97.02.19gnStatus=STAT_ERROR*/
gnStatus=STAT_OK
或者
/*ModifiedbyISE/Zhang97.02.19forbuglackof&*/
sockfd=socket_open_server(AF_INET,SOCK_DGRAM,&iruexec_addr_in,len);
/*sockfd=socket_open_server(AF_INET,SPCK_DGRAM,&iruexec_addr_in,len);*/
当一个函数的大部分发生变更时,可以把该函数拷贝一份,再作变更。
2)变更的时间以及版本号要记录。
在版本发行以前如果作变更,不需要加入版本号。
3)变更部分的注释格式要统一。
这样可以使用编辑工具或者检索工具,把所有的变更没有遗漏地检出。
所以使用一定的关键词是有必要的。
4)变更的场所,要一目了然。
要求注释的格式是醒目并且整齐。
2变更方法
由于变更后经常要参照变更前的源程序,考虑到这种情况,可从下述的三种变更方法中选择一个最合适的,在项目中判断。
1)源程序必须留下。
●利用条件编译。
利用条件编译能清楚的看见变更前后的源程序,且可以简单的进行变更前后的切换。
/*ModifiedbyISE/Zhang1997.02.19forxxxxxxxxxxx*/
#ifndefUNIX_BSD
xxxxxxxxxxxxxxxxxxxxx;
xxxxxxxxxxxxxxxxxxxxx;
xxxxxxxxxxxxxxxxxxxxx;
#elseUNIX_SUSV
xxxxxxxxxxxxxxxxxxxxx;
xxxxxxxxxxxxxxxxxxxxx;
xxxxxxxxxxxxxxxxxxxxx;
#endif
●把源程序给注释掉。
保留变更前的源程序,并注释掉。
在后面追加变更后的源程序。
/*————*/
/*——_*/
/*ret=AddRecvCallBack(JMS_MID_FILE_REQUEST,JMS_JB_FileRet,NULL,0);*/
/*if(ret<0){*/
/*JMS_OutMsg(IRUEXEC,”main”,
“JMS_MID_FILE_REQUEST受信处理
登录失败”);*/
/*JMS_JB_Exit
(1);*/
/*}*/
ret=AddRecvCallBack
(JMS_MID_FILE_PEQUEST,JMS_JS_FileRet,
ptrSASCASONETIME)
if(ret!
=JMS_OK)
JMS_OutMsg
(IRUEXEC,”main”,”JMS_MID_FILE_REQUEST
受信处理登录失败”);JMS_JB_Exit
(1);
}
2)利用版本管理
对于需要变更的源程序,直接给予变更。
然后利用版本管理工具来管理各个阶段版本的源程序。
或者只是简单地把原有的程序拷贝到另一个目录中,在必要的时候,在进行文本文件的对比,以明确其差异。
但也存在一个问题,即不容易知道是否是新还是旧版本。
第4章样例参考程序
1请参考MFC源代码程序库
特别注意:
本文中的样例代码若有与MFC源代码程序不一致,则以MFC源代码程序为标准。
2付.h文件的范例
/***************************************************************
*NAME:
jruexec.h
*FUNCTION:
*PROGRAMMED:
SJCS/JMS
*DATE(ORG):
93.12.3
*PROJECT:
JMS
*OS:
UNIX:
SYSTEMV
*HISTORY:
*ID—DATE————NOTE————————————————————
*0093.12.3SJCS/JMS初期作成
****************************************************************/
#ifndefJMSJB_H_
#defineJMSJB_H_
/***************************************************************
*INCLUDEFILE
***************************************************************/
#include“irujs.h”
#include”irujsmsg.m”
#include”irujssys.m”
/***************************************************************
*MACRODEFINE
************************************************************