收藏 分销(赏)

软件过程源代码编写规范.doc

上传人:精**** 文档编号:2602226 上传时间:2024-06-03 格式:DOC 页数:22 大小:142.54KB 下载积分:10 金币
下载 相关 举报
软件过程源代码编写规范.doc_第1页
第1页 / 共22页
软件过程源代码编写规范.doc_第2页
第2页 / 共22页


点击查看更多>>
资源描述
(完整word)软件过程源代码编写规范 密级:内部资料 XXX信息技术中心 代码编写规范 (信息技术部) 文档编号 版本号 v1。1 分册名称 第1册/共1册 总页数 17 正文 17 附录 编制 审批 生效日期 2012—12-01 XXX公司 文件修改控制 版本号 修改页码及条款 修改人 审核人 修改日期 目 录 一、目的 1 二、适用范围 1 三、命名规范 1 3.1 C/C++命名规范 1 3。2 Java命名规范 2 3。3 VB命名规范 2 3。4 数据库表命名规范 2 3.5 源程序文件命名规范 3 3.6 jsp/html文件命名规范 3 3。7 jsp/html代码规范 3 3。8 SQL语句规范 5 3.9 一些命名技巧 5 四、程序结构规范 5 4。1 空行 6 4.2 代码行内的空格 6 4.3 对齐 6 4。4 长行拆分 8 4.5 注释 8 4。5.1 版本、版权申明格式 8 4.5.2 函数接口说明 9 4.5.3 变量说明 10 4.6 import顺序 10 五、编码风格 10 六、一些编程经验 11 6.1 字符串比较 11 6。2 空值判断 11 6.3 慎用==和= 11 6.4 当心字符串指针 11 6.5 对象的生命周期,防止”野指针” 12 6.6 避免编写简洁但难懂的嵌套if语句 12 6.7 如何设计将字符串作为传出参数 12 6.8 惯用常量 13 6.9 参数的有效性检查 13 6。10 Java的对象引用注意赋值 13 6。11 递归调用中的堆栈控制 13 6.12 内存分配后的成功检查 14 6.13 小心内存泄露 14 6。14 别写错你的重载函数名称 14 6。15 注意边界检查 14 6.16 注意检查被除数不为0 14 附录 推荐使用的类型缩写 15 II 一、目的 良好的编程风格是提高程序可靠性非常重要的手段,也是大型项目多人合作开发的技术基础.本规范的目的在于通过规范定义来避免不良的编程风格,增强程序的易读性,便于自己和其它程序员理解。 二、适用范围 本规定适用于XXX信息技术中心所有项目的编码实现 。 三、命名规范 比较著名的命名规范当推Microsoft公司的”匈牙利"法,该命名规范的主要思想”在变量和函数名中加入前缀以增进程序员对程序的理解".但是"匈牙利”法最大的缺点是繁琐。据考察,没有一种命名规则可以让所有的程序员赞同。本命名规范是综合了各个命名规范中大部分程序比较认可的命名规则整理而成。 3。1 C/C++命名规范 局部变量和参数用大写字母开头的英文单词组合而成,一般在前面冠上小写的类型缩写(如果没有类型缩写,则第一个英文单词为小写字母开头),如果是指针变量则在类型缩写前增加前缀”p”。常用数据类型的缩写请参见附录。 常量全用大写的字母,用下划线分割英文单词,如TP_MULTILINE,MAX_VALUE。 静态变量加前缀s_(表示static),如s_dwBodySize。 全局变量加前缀g_(表示global),但一般不建议使用全局变量. 类的成员变量加前缀m_(表示member)。 过程名或函数名用大写字母开头的英文单词组合而成,并且应该足够长以描述它的作用,而且,应该以一个动词起首,如InitNameArray或CloseDialog。 类名用大写字母开头的英文单词组合而成,并在前面冠上字母"C",如CBrewWindow. 结构名和联合体名用大写字母开头的英文单词组合而成。 3。2 Java命名规范 标识符类型 命名规则 例子 包 (Packages) 一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org,或1981年ISO 3166标准所指定的标识国家的英文双字符代码.包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门(department),项目(project),机器(machine),或注册名(login names)。 com。sun.eng com。apple.quicktime.v2 edu。cmu。cs。bovik。cheese 类 (Classes) 命名规则:类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词,避免缩写词(除非该缩写词被更广泛使用,像URL,HTML) class Raster; class ImageSprite; 接口(Interfaces) 命名规则:大小写规则与类名相似 interface RasterDelegate; interface Storing; 方法 (Methods) 方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。 run(); runFast(); getBackground(); 变量(Variables) 除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。 变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途.尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型. char c; int i; float myWidth; 实例变量(Instance Variables) 大小写规则和变量名相似,除了前面需要一个下划线 int _employeeId; String _name; Customer _customer; 常量(Constants) 类常量和ANSI常量的声明,应该全部大写,单词间用下划线隔开。(尽量避免ANSI常量,容易引起错误) static final int MIN_WIDTH = 4; static final int MAX_WIDTH = 999; static final int GET_THE_CPU = 1; 3。3 VB命名规范 VB在命名规范上与C/C++相同. 另外,在VB可视化设计环境中,包含工程管理的窗体、模块、类模块、用户控件、属性页、数据报表、数据环境对象,要求在对象名称之间缀上对象类型的缩写.如frmLogin,basMain、ctlUserDefine、clsDialog,rptBilling,等等。 3.4 数据库表命名规范 数据库表的名称主要分为两个部分:第一部分为模块标识,第二部分为数据名称,两个部分使用”_"合成在一起。其中,模块标识表示数据库表所属功能模块的名字简称,一般由2到3个大写字符组成。例如UM_Module_RightSet, UM为用户及权限管理模块的标识,数据名称使用大小写混合形式,并且应该足够长以描述它的作用,不同的单词之间使用”_”分隔开。 数据库表中的各个字段的命名基本按照程序代码中变量定义格式进行定义,但一点除外,字段名不需要加上类型前缀,例如UserID。 3。5 源程序文件命名规范 C/C++和Java源程序文件名都是用大写字母开头的英文单词组合而成,其中对于C++和Java源程序文件名是当前文件中编写的主要类的名称(不包含前缀字母”C”)。 VB源程序文件名是和对象名称相同,在前面要携带类型的缩写,如basMain.bas、clsDialog。cls。 3。6 jsp/html文件命名规范 1、jsp与html文件名全部小写 2、数据/内容显示页 名词形式,多个单词用下划线分隔,要求能说明显示内容的信息,为避免冲突,可加上 “_list”或者其他的单词。 例如: news_message.html 或 file_list。jsp 3、操作处理页 命名格式:名词_下划线_动词,例如:file_delete。jsp 注意:名称最好从范围大到小命名(或者是模块名_子模块名_操作的方式),比如service_order_delete。jsp,这样子当jsp页面很多的时候,容易检索和识别。 3。7 jsp/html代码规范 (1) jsp/html描述注释 jsp/html页面顶部必须存在一个基本描述注释,包含功能描述、参数列表和历史修改信息。例如: <%—— /************************************************** * NAME : file_download.jsp * * PURPOSE : 下载文件提示 * * PARAMETERS : * file_id - 文件ID号 * force – 是否强制下载 * * HISTORY * * 2002/04/05 Hafele 创建文件 * *2002/06/07 tmp 增加强制下在功能 ********************************************** ——%〉 (2) jsp头格式 jsp头部一般需要遵循以下格式: 〈%@ page contentType="text/html;charset=gb2312" %〉 <%@ page import=”java.io。*" %> // jdk标准包 <%@ page import="javax.mail.*” %〉 // java扩展包 <%@ page import="org.apache.xml.*" %> //使用的外部库的包 〈%@ page import=”com。sunrise。。*" %〉 //使用的项目的公共包 <%@ page import=" com。sunrise。applications.*” %〉 //使用的模块的其他包 〈%@ include file=”some.jsp" %〉 //include其他的jsp <% response.setHeader(”Pragma",”No-cache”); response.setHeader(”Cache-Control”,"no—cache”); response.setHeader(”Expires”,"0"); %〉 一般jsp都需要防止缓存 (3) html格式 html头一般需要遵循以下格式: 〈head> 〈meta http—equiv="Content-Type" content="text/html; charset=gb2312"> 〈title>some title</title> <link rel=”stylesheet" href="some。css" type=”text/css"〉 〈script language=”javascript”> //some javascript 缩进4个字符 </script〉 〈/head〉 注意:必须指定一个有意义的<title>,严禁出现“Untitled”或“未命名”之类的<title>. 3。8 SQL语句规范 SQL语句要求SQL关键字全部小写,表名和字段名采用3。4节的数据库表命名规范. 例如:select UserID, Name from Account where UserID > ? and Department = ? order by Name 3.9 一些命名技巧 对于频繁使用的长项,推荐使用标准缩略语以使名称的长度合理化。一般来说,超过 32 个字符的变量名在 VGA 显示器上读起来就困难了。 当使用缩略语时,要确保它们在整个应用程序中的一致性.在一个工程中,如果一会儿使用 Cnt, 一会儿使用 Count,将导致不必要的混淆。 不要嵌套定义相同的变量名,虽然作用域不同,但是容易造成程序编写错误。 不要在一个文件中定义意义不同的相同变量名,容易引起混淆。 在C++和VB中,如果系统存在的对象(类)非常多,可以在对象名称之前加上该对象所属的功能模块简称,例如对象frmUserList窗体是用户管理模块的一个窗体,我们可以将其命名为frmUMUserList.通过这种命名方式,在工程资源管理器中列出的所有对象就能够按照不同的模块有序的排列起来,而且在文件系统中,我们也能非常方便地管理程序源文件。 在C语言中,可以在函数或过程名前加上该函数或过程所属的功能模块简称,也能够便于管理平板结构的众多函数和过程。 将程序源文件合理地按照目录结构进行放置,目录结构可以按照模块和功能来设计。在Java中的Package机制就对应着文件系统中相应的目录结构。 四、程序结构规范 除了命名规范外,程序的结构化编码规范可以极大地改善代码的可读性,如代码注释和一致性缩进。 4。1 空行 空行起着分割程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,所以不要舍不得用空行。 (1) 在每个类声明之后、每个函数定义结构之后要加空行(至少一个空行,建议两个空行)。 (2) 在一个函数体内,逻辑上密切相关的语句段之间不加空行,其它地方应加空行分割。 (3) 程序头部和程序主体之间要加空行。 (4) 变量定义和代码段之间要加空行。如果变量定义只有一、两行,而且又是在函数的主体内部定义的,可以将变量定义紧跟后面的代码段,不需要空行。 4.2 代码行内的空格 关键字之后要留空格。象if、for、while等关键字之后应留一个空格再跟左括号”(“,以突出关键字。当然,象const、virtual、inline、case等关键字之后至少要留一个空格,否则在语法上无法辨析关键字。 函数名之后不要留空格,紧跟左括号”(“,以与关键字区别。 “(”向后紧跟,“)”、“,”、“;”向前紧跟,紧跟处不留空格. “,“之后要留空格,如Function(x, y, z);。 如果“;"不是一行的结束符号,其后要留空格,如if (initialization; condition; update)。 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”、“>=”、“〈="、“+”、“*”、“%”、“&&"、“||”、“〈<"、“^”等二元操作符的前后都应当加空格。 一元操作符如“!”、“~"、“++"、“-"、“&”(地址运算符)等前后不加空格. 象“[ ]”、“."、“—>"这类操作符前后不加空格。 对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些字表达式的空格,如for  (i=0;  i<10;  i++) 和 if  ((a<=b)  &&  (c〈=d))。 4。3 对齐 程序的分界符号“{”和“}"应独占一行并且位于同一列,同时与引用他们的语句左对齐。 标准的、基于制表位的嵌套块应该被缩进四个空格。 如: for (i=0; i<10; i++) { if ((a <= b) && (c 〈= d)) { //code } } 特别的,switch语句的缩进格式如下: switch (expression) { case 0: { //code } break; case 1: { //code } break; … default: { //code } break; } 4。4 长行拆分 代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。 长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读. 例如: If ((very_longer_variable1 >= very_longer_variable2) && (very_longer_variable3 <= very_longer_variable4) && (very_longer_variable5 <= very_longer_variable6)) { dosomething(very_longer_param1, very_longer_param2, very_longer_param3 ); } 4。5 注释 程序块注释一般采用”/* … */”,行注释一般采用”//…”.特别的,C语言只能采用”/* … */"注释,而VB只能采用”’"进行行注释。注释通常用于: 文件头的版本、版权申明. 参数的说明。 函数定义开始处的接口说明. 重要的代码行或段落提示。 注释是对代码的”提示”,而不是文档。程序中的注释不可太多,注释的花样要少。 边写代码边注释.修改代码同时修改相应的注释,以保证注释与代码的一致性.不再有用的注释要删除。 4。5.1 版本、版权申明格式 /* * Copyright © 2005, 北京东方般若科技发展有限公司 * All rights reserved * * 文件名称: * 摘要: * * * 当前版本:1。1 * 作者: * 完成日期: * * 原有版本:1。0 * 原作者: * 完成日期: */ 4。5.2 函数接口说明 /* * 函数名称: * 函数说明: * * 输入参数: * 参数1: * 参数2: * … * 输出参数: * 返回值: * */ 4.5.3 变量说明   使用行注释.要求每个成员变量和全局变量都要注释。如: int m_nWindowCount; //被管理的窗口数量 4.6 import顺序 import包按以下顺序: (1) jdk标准包 (2) java扩展包(例如servlet,javamail,jce等) (3) 使用的外部库的包(例如xml parser) (4) 使用的公司范围的公共组件包 (5) 使用的当前项目的公共包 (6) 使用的模块的其他包 例如: import java.io.*; import java.util.*; import javax.servlet.*; import javax。mail.*; import org。apache。xml。*; import com。wisdom.base。*; import com.wisdom。db。*; import com.wisdom。cxt.server。*; 五、编码风格 (1) 类模块定义中不要使用过多的不必要的成员变量,尽量定义成局部变量。有需要的话使用调用参数的方式通过函数调用在不同的代码段之间传递变量。 (2) 对象类之间的调用关系明确,不要出项杂乱无章的调用关系,尤其不要出现相互调用或迭代调用的关系,可以通过接口的方式来解决相互调用的问题。 六、一些编程经验 6。1 字符串比较 在Java中,不要使用”==“来判断两个字符串是否相同,因为字符串String在Java语言中是对象,使用”==“只能判断两个字符串是否为同一个对象,即它们的引用是否相同,结果为true,表明两个字符串的内容肯定相同,但是结果为false,却不能表明两个字符串的内容肯定不同。因此,要使用String类的equals方法来判断两个字符串内容是否相同。 6.2 空值判断 论在任何语言平台中,如果对空值对象(对象指针)调用必然都会产生错误.因此,在调用对象的方法之前,一定要保证对象值不空。另外,在将对象传递给其它方法进行调用之前,一般也需要检查对象是否为空,避免调用函数没做空值检查而可能出现错误。 6.3 慎用==和=   在大部分表达式中,如果将”==“和”=“互换,并不会产生语法错误,但语义却完全不同。这样一来,如果程序员出现误写,就会在调试中种下难以发现的Bug。一定要严格检查表达式中对==的使用 6.4 当心字符串指针 在C/C++中,字符串指针就是指向一段分配的内存,并且以"\0”结束。要确保字符串在分配的内存范围内以”\0"结束,否则将产生内存溢出,这样字符串操作将会覆盖其它内存区域(也就可能会修改到其它内存变量的值),造成不可确定的错误。 另外,结束符"\0”也是要占一个字节内存,因此在申请内容空间的时候需要将结束符的占用空间考虑在内。如,要将长度为12的字符串"hello world!”存储在内存中,就要进行如下定义: char text[12 + 1]; 或者 char *text = malloc(12 + 1); 另外,大部分平台都已经支持unicode编码的字符串,它是以连续两个”\0”结束的,因此,对于unicode编码的字符串就需要多分配两个字节的内存空间。 6.5 对象的生命周期,防止”野指针” 在free或delete之后,一定注意将指针变量置NULL或者赋值为一个有效的内存变量指针,否则将会产生无效指针,如果继续使用该指针,肯定会发生内存访问错误。对于这个问题,尤其是在将指针变量传递到其它一些模块并赋给其它指针变量时,一定要保证在一个地方将指针所指向的内存回收后,其它地方也能够及时地刷新本地的指针变量,或者不再使用本地的指针变量。 还有一个默认的规则,就是对象指针产生于哪个模块,就由哪个模块负责对该对象指针的回收。这样可以减少指针使用上的混乱。 在Java中,由于本身支持垃圾自动回收,因此不会有野指针(引用)的现象。 6。6 避免编写简洁但难懂的嵌套if语句 首先,紧凑的代码并不一定能产生高效的机器码。 有时候,我们在编写条件语句时,如果我们将条件表达式写得复杂一些,可以减少一些条件分支,但是表达式却非常晦涩难懂,容易造成错误,也不易进行代码功能调整。要求嵌套if语句结构清晰,可以容许少量重复代码,对于重复代码过多,可以将重复代码设计为一个函数调用。 6.7 如何设计将字符串作为传出参数 首先,可以通过调用参数来传出字符串。使用该方式时,需要在调用前分配好足够的内存空间,并且将内存指针和可用的内存空间大小同时传给调用函数;在函数处理中,需要根据可用空间的大小来决定将返回的内容存储到内存空间之中,函数主体需要确保不对内容越界使用。如 int GetResult(char *szText, int len)。 还有,可以通过返回值来传出字符串。对于这种方式,返回结果的内存空间是在调用函数内部进行分配的,该调用函数不负责对该内存空间的回收。函数调用方通过调用得到返回的字符串指针,在使用完毕后需要负责回收字符串的内存空间。 以上两种方式各有利弊.第一种方式要求每次调用都需要自己分配内存,比较麻烦,但是由于内存分配和内存回收都在同一个模块中,不易造成内存泄露;第二种方式调用简单,当我们无法预计返回字符串的最大长度时,就只能采用第二种调用方式,如果使用第一种调用方式,返回字符串的部分内容就有可能被截掉。 6.8 惯用常量 如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦? (1) 程序的可读性变差。程序员自己会忘记那些数字或字符串是什么意思,维护人员则更加不知道它们从何处来、表示什么. (2) 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。 (3) 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错. 在C/C++中,较好的习惯就是将一个工程中的所有常量都集中定义在一个常量定义头文件之中,如Const。h。在Java中,由于语言的特性,常量就只能定义在每个类之中了。 6.9 参数的有效性检查 很多程序错误是由非法参数引起的.我们应该在函数的入口处首先检查传入的各个参数的合法性,如果存在错误,则函数直接返回.比较常见的检查就是空值检查。 6.10 Java的对象引用注意赋值 与C++不同,Java对象在声明时都是空对象,必须对其赋上初值才能对该对象进行正常的使用。如: String s; int len = s.length(); //出现错误 s = “hello world!" (或 s = new String(“);) len = s.length(); //正确 6.11 递归调用中的堆栈控制 局部变量的内存空间都是在栈上分配的,而栈的大小是有限制的,一般为64K。一般情况下,函数的调用层次还是比较有限,可能在10~20左右,这都不太会占用过多的内存,但在递归调用情况下,调用层次可能达到上百甚至上千,而递归函数中定义的局部变量占用内存又比较大的话,上百次调用后就可能出现堆栈溢出的现象。 6。12 内存分配后的成功检查 在面向一些内存受限的平台(如KJava、BREW)开发应用时,在每次申请分配内存后都需要检查是否成功,如果在不检查的情况下直接使用返回的对象指针(或对象引用),有可能因为内存分配不成功而导致程序错误,无法恢复。 然后,如果每次分配内存都去检查又显得过于繁琐,解决这个矛盾的方法就是通过例外处理的办法,可以批量地检查一个大程序块中的内存申请结果。 6.13 小心内存泄露   通过malloc和new操作获得的对象,在使用完毕后一定要通过free或delete操作对内存进行回收. 6。14 别写错你的重载函数名称   在子类中要重载父类中的某个函数时,一定要养成拷贝的好习惯。如果我们手工编写重载函数,如果函数名书写错误,编译器是无法识别出来的,等待我们的只有是运行错误,而这个错误不通过单步跟踪是很难发现的。 6.15 注意边界检查 边界数值是错误的高发因素,包括: (1) 数组的下标检查; (2) for循环的边界检查; (3) 内存指针处理时的边界检查。 6.16 注意检查被除数不为0 当我们在编写除法表达式时,由于被除数都是变量,我们一般会忽略被除数为0的错误情况。因此,在执行表达式之前一定要检查被除数变量是否为0。 附录 推荐使用的类型缩写 数据类型 前缀 boolean, bool, BOOLEAN bln byte b Int, integer, Int, n Short N long lng DWORD Dw WORD W float F double Dbl char C, chr Char* Sz WCHAR Wsz CSTRING Str String Str AECHAR* sz, wsz AECHAR chr Single sng Object Obj User Defined Type udt Menu mnu Form frm Frame fra Grid grd DataGrid dgd Image img Label lbl TextBox, TextField txt Timer tmr Toolbar tlb TreeView tvw ComboBox Cbo MS Flex grid msg OLE container ole Option button opt Picture box pic ProgressBar prg Recordset rs List box lst ListView lvw RichTextBox rtf 其它 用唯一的由两个或三个字符组成前缀 第 18 页 / 共 17 页
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 品牌综合 > 行业标准/行业规范

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服