欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    软件编码规范.doc

    • 资源ID:17690403       资源大小:223.50KB        全文页数:15页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    软件编码规范.doc

    【精品文档】如有侵权,请联系网站删除,仅供学习与交流软件编码规范.精品文档.天正软件编码规范一、 命名规范1、 通则1.1、 在所有命名中,都应使用标准的英文单词或缩写,避免使用汉语拼音。1.2、 所有命名都应遵循达意原则,即名称应含义清晰、明确。1.3、 所有命名都不易过长,在可表达清晰的前提下越简洁越好。1.4、 所有命名都应尽量使用全称。1.5、 在类型名称特别复杂的时候,应使用typedef来定义别名。2、 标识符2.1、 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。(较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写)如下单词的常用缩写application appargument argaverage avgblock blkbuffer bufcommand cmdcontrol ctrldatabase dbdelete deldescription descdialog dlgdictionary dictdimension dimdistance distdocument docentity entescape escflag flgincrease incinformation infolength lenlibrary libmanager mgrmemory memmessage msgobject objpassword pwdpicture picployline plinepointer ptrposition posrecord recreference refresource rscscreen scrserver srvsource srcsystem systemp tmptext txtversion verwindow wndVC+中常用控件缩写Animate aniCheck Box chkComboBox cmbEdit edtGroup Box grpListBox lstPicture picProgress prgPush Button btnRadio Button radScroll Bar sbSlider sldStatic stcTab Control tab2.2、 长的标识符应使用缩写来缩短长度,而特短的标识符应该避免使用缩写。更恰当:int iFlagHMODULE hLoadedSysRsc不恰当:int iFlgHMODULE hLoadedSystemResource2.3、 变量和封装体命名中单词或缩写的第一个字母应大写,其它字母小写,单词和单词之间直接连接,不得有其它字符。在宏定义中全部用大写,单词与单词之间必须用下划线连接。正确:TempResource#define REG_KEY错误:Temp_Resource temp_resourcetempresource#define Reg_Key2.4、 除了编译开关/头文件等特殊应用,应避免使用_EXAMPLE_TEST_之类以下划线开始和结尾的定义。2.5、 对于变量命名,禁止取单个字符(如i、j、k.),命名除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k等作局部循环变量是允许的。2.6、 命名时,如果需要进一步分类时,分类属性应放在前面。正确:CListBox m_wndLstFonts;CComboBox m_wndCmbColors;错误:CListBox m_wndFontsLst;CComboBox m_wndColorsCmb;2.7、 命名中若使用特殊约定或缩写,则要有注释说明。(应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明)2.8、 在命名规范中没有规定到的地方,才可以使用自己特有的命名风格,要自始至终保持一致,不可来回变化。2.9、 除非必要,不要用数字或较奇怪的字符来定义标识符。正确:#define EXAMPLE_TESTTestLockDriver错误:#define EXAMPLE_0Test1232.10、 在同一软件产品内,应规划好接口部分标识符的命名,防止编译、链接时产生冲突,可在普通标识基础上加上模块标识。示例:在TGRX模块中可定义为 CTGRxObject g_rxRegistry在TGDB模块中可定义为 CTGDbBlockRecord g_dbGlobal在TGGui模块中可定义为 CTGUiFrameWnd g_uiCmdMgr2.11、 命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,比如有关STL的代码应使用STL中的全小写加下划线的风格,有关MFC的代码则使用大小写混排的方式。3、 封装体3.1、 采用前缀和以大写开头的英文单词或缩写组成,即:前缀 + 标识符。简写 类型 说明C class 类S struct 结构体E enum 枚举U union 联合体示例:class CTree ;struct SResBuf ;enum ESeekType ;union UResVal;4、 变量4.1、 变量命名应遵循匈牙利记法,即:前缀 + 类型 + 标识符。4.2、 前缀简写 类型 说明m_ class member 类的成员变量s_ static variable 静态全局变量g_ global variable 普通全局变量注意:1、 struct/union中的成员变量不加前缀,即:类型 + 标识符2、 const成员变量应使用k + 标识符3、 enum中的成员应使用k + 标识符示例:m_arsName m_lFilePoss_cConfig s_iLoopTimesg_hResouce g_sModuleNamestruct STreeDataHICON hTreeIcon;TCHAR szTreeName;;class CVector3dconst CVector3d kIdentity;const CVector3d kXAxis;enum EDirectionkLeft,kRight,;enum EErrorStatuskOk,kOutOfMemory,;4.3、 类型基本类型简写 类型 说明by byte 字节b bool 布尔型n short 短整型n UINT 无符号整型i int 整型l long 长整型w WORD 双字节dw DWORD 四字节f float 浮点数d double 双精度数ch char 字符型sz char 以0结尾的字符串cr COLORREF color refpsz LPCTSTR const char*字符串指针psz LPTSTR char*字符串指针wnd window 窗口类fn function 函数p pointer 指针ar array 数组lst list 链表map map 影射e enum 枚举u union 联合c struct 一般的结构体c class 一般的类注意:1、 有的类型可以组合以表示复杂的数据类型,即:主数据类型 + 修饰类型2、 字符串指针char*、const char*应使用LPTSTR、LPCTSTR替代3、 在类型前加const,命名约定不变示例:byte byVal; BYTE byVal;bool bVal; BOOL bVal;short nVal; SHORT nVal;UINT nVal; CUIntArray arnVal;int iVal; INT iVal;long lVal; LONG iVal; ULONG lVal;WORD wVal; WORD g_wVal;DWORD dwVal; DWORD m_dwVal;float fVal; float& fVal;double dVal; double* pdVal;char chVal; TCHAR chVal;char szName5; TCHAR szName5COLORREF crBackground;LPCTSTR pszName;LPTSTR pszName = new TCHAR5;CButton wndOk; CToolBar wndTBarWNDPROC pfnProc;void* pUnknown; LPCTSTR pszKey;CStringArray arsVal;CPtrList lstpVal;CMapPtrToPtr mapVal;enum EFileType eFileType;union UResval cVal;struct STreeData cData;class CStudent cXiaoMing;void* ppVal;CStringArray arsNames;LPCTSTR pszName;LPCTSTR pszVal; LPTSTR pszVal;Windows / VC+ / MFC类型s CString 字符串dc CDC 设备环境对象bmp CBitmap 位图pen CPen 画笔br CBrush 画刷fnt CFont 字体rgn CRgn 区域imglst CImageList 图片列表mnu CMenu 菜单pt CPoint 点vt vector 向量mat matrix 矩阵sz CSize 尺寸rc CRect 矩形tm CTime 时间pos POSITION 位置h handle 句柄类p smart point 智能指针CString sFileName;CClientDC dcMem;CBitmap bmpLogo;CPen penRed;CBrush brBlue;CFont fntArial;CRgn rgnClip;CImageList imglstIcons;CMenu mnuPopup;CPoint ptPosition; POINT ptMousevector vtVal;matrix matTransform;CSize szNormal;CRect rcClient; RECT rcDefault;CTime tmCurrent;POSITION posStart;HDC hDC; HTREEITEM hParent;_com_ptr_t<> pInterface;AutoCAD / ObjectARX类型pt ads_point ads点ent ads_name ads实体ss ads_name ads选择集mat ads_matrix ads矩阵d ads_real ads实数rb struct resbuf ads链表pt AcGePoint2d/3d 点vt AcGeVector2d/3d 向量sc AcGeScale2d/3d 比例mat AcGeMatrix2d/3d 矩阵ext AcDbExtents 边界id AcDbObjectId idar AcArray 数组tol AcGeTol 误差ads_point ptStart;ads_name entLine;ads_name ssPickSet;ads_matrix matTransform;ads_real dDistance;struct resbuf rbXData;AcGePoint3d ptPosition;AcGeVector2d vtDirection;AcGeScale3d scZoom;AcGeMatrix2d matRotateAcDbExtents extView;AcDbObjectId idEnt;AcDbVoidPtrArray arpSubEntity;AcGeTol tolTemp;5、 函数5.1、 推荐使用动宾结构。函数名应清晰反映函数的功能、用途,见名知意。常见的函数命名开始:Init_, Open_, Create_, Get_, Set_, Read_, Load_, Write_, Start_, Stop_, Check_, Test_, Fill_, Process_, Sort_, Do_, Select_, Is_, Exist_,5.2、 函数名每个单词或缩写的第一个字母必须大写。正确:void DoJig()BOOL IsEmpty();错误:void DO_JIG();void Do_Jig();6、 宏6.1、 使用单词或单词缩写,所有字母大写,单词之间使用_分隔。6.2、 在定义类似函数或变量的宏时例外,可参照函数或变量的命名规范。示例:#define IsZero(dVal) (fabs(dVal) < EPS)#define g_rxRegistry AcRxRegistry:cast(g_cGlobal.GetRegistry()7、 文件名7.1、 文件名每个单词或缩写的第一个字母必须大写。7.2、 文件的命名也应达到见名知意,能够反映该文件所包含的内容。7.3、 如果文件中仅包含一个主要封装体的相关内容,则该文件名应使用封装体的名称。8、 控件ID和窗口对象8.1、 控件ID的命名应采用全部大写,各式为:IDC_控件类型缩写_标识符。8.2、 控件窗口对象的命名应在窗口类型后加控件类型缩写。常用控件命名列表:文本Static IDC_STC_XXX m_wndStcXxxPicture IDC_PIC_XXX m_wndPicXxx编辑框Edit IDC_EDT_XXX m_wndEdtXxxComboBox IDC_CMB_XXX m_wndCmbXxxGroup Box IDC_GRP_XXX m_wndGrpXxxPush Button IDC_BTN_XXX m_wndBtnXxxRadio Button IDC_RAD_XXX m_wndRadXxxCheck Box IDC_CHK_XXX m_wndChkXxxList Box IDC_LST_XXX m_wndLstXxxScroll Bar IDC_SCR_XXX m_wndScrXxxSpin IDC_SPN_XXX m_wndSpnXxxProgress IDC_PRG_XXX m_wndPrgXxxSlider IDC_SLD_XXX m_wndSldXxxTab Ctrl IDC_TAB_XXX m_wndTabXxxList Ctrl IDC_LST_XXX m_wndLstXxxTree Ctrl IDC_TRE_XXX m_wndTreXxxAnimate IDC_ANM_XXX m_wndAnmXxx二、 编写规范1、 通则1.1、 尽量使用标准库函数和公共函数。1.2、 只能有唯一的声明和实现,提供包含使用。1.3、 不要随意定义全局变量,尽量使用局部变量。1.4、 全局变量和函数应放到命名空间中或静态类中或声明成静态函数。1.5、 程序结构清晰,简单易懂,单个函数的程序行数尽量短。1.6、 变量使用时要注意越界。1.7、 字符串操作应该支持处理UNICODE。1.8、 使用指针之前要做有效性判断。2、 源文件2.1、 在源文件(.h / .cpp)的开头应包含一段格式统一的说明,至少包括以下内容:版权说明、文件名称、版本号、作者、生成时间、文件功能用途说明、维护记录。/ Copyright (C), 1998-2007, Beijing Tangent Engineering Software Co. Ltd./ = FileName: 文件名称/ = Version: 版本号/ = Author: 作者/ = Date: 创建时间/ = Description: 文件功能、用途等说明/ = Maintainers: / 版本号 时间 修改人 修改内容2.2、 对于同时对应有.h和.cpp的文件,维护记录(Maintainers)应写在.h中,则在.cpp中可以省略。2.3、 在头文件(.h)中应提供为防止文件交叉包含的预编译宏,宏的定义应和文件名称一致,格式应为“_XXXX_H_”。示例:#if !defined(_MYSAMPLE_H_)#define _ MYSAMPLE _H_#endif / _ MYSAMPLE _H_2.4、 对于无关的垃圾注释以及向导注释,一律清除,保持文件内容整洁。3、 封装体3.1、 在class / struct / union / enum等封装体声明之前,应包含有对该封装体的功能用途等有关的说明。3.2、 函数的声明应在变量的声明之前,不同的访问属性应按public / protected / private循序先后声明。3.3、 不被公开使用的声明不应放置在public块下,不需被继承的声明应放置在private块下。3.4、 一行只能声明一个成员变量或成员函数。3.5、 除了自动生成的Wizard代码,声明的变量和函数必须注释,且注释应该在其之前独占一行,并排列对齐。3.6、 对于enum的声明中,第一个成员应赋初始值,成员的注释可以放置在成员的声明之后。3.7、 struct / union中成员应使用简单数据类型3.8、 在仅有数据成员的封装体中允许成员变量不带m_前缀,在表达数据分量和使用频繁的情况下允许成员不带m_前缀(如点对象的分量x,y)。3.9、 对于不从其他封装体继承也确定不被继承的封装体,析构函数不应使用virtual修饰词。3.10、 封装体中元素的个数应适中并合理排布。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数。3.11、 封装体的功能要单一,是针对一种事务的抽象;不要设计面面俱到,非常灵活的数据结构;不同封装体间的关系不要过于复杂;封装体的设计要考虑兼容和升级问题。4、 变量4.1、 变量应随时用随时声明,对代码效率有要求的循环体中,变量应声明在循环体外。4.2、 变量声明的同时应赋初值,析构或程序退出时判断释放所有变量。4.3、 一个变量只做一种应用,赋予一种意义。4.4、 对于作用域较大的变量和重要意义的变量应给予必要的注释。4.5、 指针型变量声明应一行只声明一个,不应与其他类型变量一起声明;声明中“*”号既可以紧接类型,也可以紧接变量名,不可以单独隔开。4.6、 不同类型的变量声明应各自独占一行,不可混到同一行。5、 函数5.1、 提高函数独立性,降低函数间的耦合度,一个函数应该只实现一个功能。5.2、 除非极其简单,否则应有注释说明,内容包括:功能、入口/出口参数、返回值,必要时应该有维护记录。/ = Function Name: 函数名称/ = Description: 函数功能、用途等说明/ = Return: 类型、返回值范围和意义/ = Parameters:/ 类型 变量名 IN/OUT 取值范围和说明/ = Maintainers: / 版本号 时间 修改人 修改内容5.3、 不要将没有关联的语句放到一个函数中,避免函数中的不必要语句,防止程序中的垃圾代码。更恰当:/ 初始化矩形的长与宽void InitRect() rect.length = 0; rect.width = 0;/ 初始化点的坐标void InitPoint() point.x = 10; point.y = 10;不恰当:void InitVar() / 初始化矩形长宽 rect.length = 0; rect.width = 0; / 初始化点的坐标 point.x = 10; point.y = 10; 5.4、 函数功能是可以预测的,输入数据相同时就应该产生相同的输出。5.5、 函数的参数不允许在函数体内被修改的应加修饰词const,函数返回值不允许被修改的应加修饰词const,但是对于简单数据类型除外。5.6、 成员函数中,如果不涉及到对封装体数据成员修改的,应在函数最后加修饰词const。5.7、 参数传递中,如果参数包含大量数据时,应使用引用或指针方式传递。5.8、 函数返回值范围应充分考虑,并作全面处理。5.9、 要检查函数参数的合法性,对函数参数的合法性检查可以由函数的调用者负责,也可以由函数本身负责,同一项目应使用同一种检查方法,缺省是由函数调用者负责,在函数本身只使用断言宏为调试使用。5.10、 防止将函数的参数作为工作变量,函数调用不成功时,函数参数保证不被修改。5.11、 重复且独立性较强的代码应抽取成函数,功能不明确且较小的函数,特别是仅有一个上级函数调用它时,应考虑把它合并到上级函数中,而不必单独存在。5.12、 递归调用特别是函数间的递归调用(如A->B->C->A),影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间);递归调用对程序的测试有一定影响。故除非为某些算法或功能的实现方便,应减少没必要的递归调用。6、 宏6.1、 宏定义表达式时,要注意完备的括号。正确:#define AREA(dL, dH) (dL) * (dH)错误:#define AREA(dL, dH) dL * dH6.2、 将宏所定义的多条表达式放在大括号中。6.3、 使用宏时,不允许参数发生变化。正确:#define SQUARE(iX) (iX) * (iX)int iVal = 5;int iRes = SQUARE(iVal);iVal +;错误:#define SQUARE(iX) (iX) * (iX)int iVal = 5;int iRes = SQUARE(iVal+);6.4、 宏定义中一般不使用缩进,但是当宏定义比较复杂时可使用缩进。6.5、 对较复杂的断言宏加上明确的注释,不能用断言宏来检查最终产品肯定会出现且必须处理的错误情况。7、 排版7.1、 相对独立的程序块之间、函数间要有空行分开。7.2、 变量的定义尽可能放在最开始处,多态函数和功能相近的函数集中放在一起。7.3、 循环、分支代码,判断条件与执行代码不得在同一行上,且循环体外要加花括号“ ”。7.4、 程序块的分界符“”应独占一行,且位于同一列,同时与引用它们的语句左对齐。7.5、 不允许把多个短语句写在一行中,即一行只写一条语句。7.6、 声明变量时对齐变量名,并在定义时加以注释说明。7.7、 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如>)后不应加空格。规则:1 逗号、分号只在后面加空格2 一些双目操作符如“=”、“+=”等前后应加空格3 一些单目操作符前后不加空格4 “->”、” . ”前后不加空格5 if、for、while、switch等与后面的括号间应加空格6 函数名与后面的括号不应加空格7 不要连续留两个以上空格示例:int iA, iB, iC; iA = iB + iC; iA = iB 2;iA *= 2; iA += iB;*piA = iA; iA+;pA->idK = iK; ptA.x = dX;if (iA + iB < iC) while (iA >= 0)switch (eType)MessageBox(“Ok!”);7.8、 对齐和缩进以 TAB 为单位,不使用空格。1 个 TAB 为 4 个空格。下列情况,代码缩进一个 TAB:8 函数体相对函数名及“”“”9 if、else、for、while、do 等执行体10 class / struct / union / enum 成员下列情况,不必缩进:1 switch 之后的 case、default2 Public、protected、private关键字7.9、 划分新行1 长的语句(>80字符)要分多行书写。2 长表达式要在低优先级操作符处划分新行。3 操作符放在新行之首。4 新行应有适当的缩进。示例:BOOL bFlag = (iTaskNo < MAX_TASK_NUMBER) && (StateItemIsValid(stateitem) && (tableiTaskNo.iResult != 0);8、 代码8.1、 在代码中尽量不用具体的大小数值,定义成宏,便于以后维护。8.2、 在数据存取和接口代码中,为保证系统间的兼容性,不应使用int类型(因为不同系统之间的存储字节长度往往不同),应使用long或short型。8.3、 在逻辑表达式中应将常量放在比较符之前,以减少误写造成的错误。更恰当:=误写成=时,编译报错LPCTSTR pszName = “Abc”if (NULL = pszName)不恰当:=误写成=时,不易察觉LPCTSTR pszName = “Abc”if (pszName = NULL)8.4、 少使用malloc、free、realloc,多用new、delete,new,delete是规范的C+语

    注意事项

    本文(软件编码规范.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开