作为一位开发人员,都要有严格的代码规范。为此我总结了一些代码规范案例。
目 录
1. 前言
2. 试用范围
3. JAVA命名规范--
3.1 公共约定
3.2 Java文件、包
3.3 类、接口命名规范
3.4 方法命名规范
3.5 常量
3.6 变量和参数
3.7 组件/部件
3.8 集合
3.9 神秘的数
3.10 其他
3.11 Java异常
3.12 数组命名
3.13 数据库表命名规则
3.14 数据库字段命名规则
3.15 JSP文件命名
3.16 Servlet类命名
4. 书写格式规范
4.1 缩进
4.2 空格
4.3 对齐
4.4 空行
4.5 注释
5. 代码文件风格
1. 前言 为确保系统源程序可读性,从而增强系统可维护性,兹制定下述编程规范,以规范系统各部分编程。系统继承的其它资源中的源程序也应按此规范作相应修改。
2. 试用范围 本文档将作为河北邮政应用系统软件(JAVA语言)开发的编程格式规范。在系统的编码、测试及维护过程中,要求严格遵守。
3. JAVA命名规范
3.1 公共约定 命名指系统中对源文件名、方法、目录、包、数据库表名、数据库字段等的命名。
系统所用的命名都使用英文缩写来表达。
命名的组成方式为:前缀+{命名词素缩写},前缀表达出命名的用途,如数据库表等。
命名的前缀由项目组确定。
除系统公共维护对象外的其他对象,命名全部用小写。一种方式用“_”作连接符,另一种方式是词素的第一个字母大写直接连接在一起。在本规范中,数据库名、数据库字段名采用第一种方式,其余采用第二种方式。
使用可以准确说明变量/字段/类/接口/包等的完整的英文描述符。例如,采用类似 firstName,listAllUsers 或 CorporateCustomer 这样的名字,严禁使用汉语拼音及不相关单词命名,虽然Java支持Unicode命名,但本规范规定对包、类、接口、方法、变量、字段等不得使用汉字等进行命名
采用大小写混合,提高名字的可读性。一般应该采用小写字母,但是类和接口的名字的首字母,以及任何中间单词的首字母应该大写。包名全部小写。
尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等,如实现(implement)可缩写成impl,经理(manager)可缩写成mgr等,具体参看下表,严禁滥用缩写。 避免使用长名字(最好不超过 25 个字母)。
避免使用数字,但可用2代替to,用4代替for等,如:go2Jsp。
3.2 Java文件、包
文件名当与其类严格相同,所有单词首字母大写。
包名一般以项目或模块名命名,少用缩写和长名,一律小写。
基本包:com.czpost,所有包、文件都从属于此包。
包名按如下规则组成: [基本包].[项目名].[模块名].[子模块名]... 如: com.czpost.eims com.hepost.eims.until„
不得将类直接定义在基本包下,所有项目中的类、接口等都当定义在各自的项目和模块 包中。
3.3 类、接口命名规范 所有单词首字母大写。使用能确切反应该类、接口含义、功能等的词。一般采用名词。
接口可带I前缀或able、ible、er等后缀。
3.4 方法命名规范 方法的命名应采用完整的英文描述符,大小写混合使用:所有中间单词的第一个字母大写。法名称的第一个单词常常采用一个有强烈动作色彩的动词。 取值类使用get前缀,设值类使用set前缀,判断类使用is(has)前缀。 例: getName() setSarry() isLogon() 方法参数建议顺序:(被操作者,操作内容,操作标志,其他⋯) 例:public void replace(String sourceStr, String oldStr, String newStr) { ........ }
3.5 常量 采用完整的英文大写单词,在词与词之间用下划线连接,如:DEFAULT_VALUE
3.6 变量和参数 变量建议采用匈牙利命名法,词素规则见“公共约定”
整型变量(包括int,short,long):以 n 开头,例如:long nCredNum;
浮点型变量(包括float,double):以 f 开头,例如:double fTranAmt;
字符变量:以 c 开头,例如:char cPageFlag;
日期型变量:以d开头,例如:date dToday; 布尔型变量:以is开头,例如:boolean isFlag;
字符串变量:以 s 开头,例如:char sPageNo[2+1];
全局变量:以g开头结合数据的类型,例如:char gsBankNo[10+1];
静态变量:静态变量在文件中同样是全局变量,命名规则同全局变量。
系统级变量:系统级变量同样是全局变量,以 ‘_'开头结合数据的类型。
例如:char _sBankNo[10+1] 没有‘g'。
临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型。
3.7 组件/部件 应采用完整的英文描述符命名组件(接口部件),遵循匈牙利命名法则 如:btnOK,lblName。 按钮变量 btn+Xxxxxxx 例如:btnSave, btn Exit, btnPrint等 题标变量 lbl+Xxxxxxxx 例如:lblName, lblSex等 对象类型 前缀 Canvas cvs CheckBox chk Image img List lst Choice chc Dialog dlg Event evt Frame frm Menu menu Panel pnl TextArea txa TextField txf
3.8 集合 一个集合,例如数组和矢量,应采用复数命名来表示队列中存放的对象类型。命名应采用完整的英文描述符,名字中所有非开头的单词的第一个字母应大写,适当使用集合缩写前缀。如: Vector vProducts = new Vector(); //产品向量 Array aryUsers = new Array(); //用户列表
3.9 神秘的数 程序里经常会用到一些量,它是有特定的含义的,把神秘的数定义为一个常量。注意这个常量的命名应该能表达该数的意义,并且应该全部大写,以与对应于变量的标识符区别开来。例如50这个数,可以定义为一个名为NUM_OF_EMPLOYEES的常量来代替。
3.10 其他 命名时应使用复数来表示它们代表多值。如:orderItems。
3.11 Java异常 异常类名由表示该异常类型的单词和Exception组成,如ActionException。
异常实例一般使用e、ex等,在多个异常时使用该异常名或简写加E,Ex等组成,如: SQLEx ActionEx
3.12 数组命名 数组应该总是用下面的方式来命名: byte[] buffer; 而不是 byte buffer[];
3.13 数据库表命名规则 前缀与命名词素间用下划线分隔。 命名由小写字母组成。
命名词素如果由单一词组成,可用全拼;如果是多词组成,用缩写。缩写间用下划线。 例如: 库表:以‘t_'开头 视图:以‘v_'开头 库表索引:以‘t_'开头, 以‘_idx'结尾 库表唯一索引:以‘t_'开头,以‘_uidx'结尾
3.14 数据库字段命名规则
命名词素如果由单一词组成,可用全拼;如果是多词组成,用缩写。缩写间用下划线。 命名由小写字母组成。 没有前缀。
3.15 JSP文件命名 采用完整的英文描述说明JSP所完成的功能,尽可能包括一个生动的动词,第一个字母小写,如:viewMessage.jsp、editUser.jsp或者forumChooser.jsp等。
3.16 Servlet类命名 一般对应于所服务的对象加后缀Service来命名,如:UserService,TradeService等。
4. 书写格式规范 严格要求书写格式是为了使程序整齐美观、易于阅读、风格统一,程序员对规范书写的必要性要有明确认识。建议源程序使用eclipse工具开发,格式规范预先在工具中设置。
4.1 缩进 缩进建议以4个空格为单位。预处理语句、全局数据、标题、附加说明、函数说明、标号等均顶格书写。语句块的"{"、"}"配对对齐,并与其前一行对齐,语句块类的语句缩进建议每个"{"、"}"单独占一行,便于匹对。sclipse 中的默认方式是开始的"{"不是单独一行,建议更改成上述格式。
4.2 空格 原则上变量、类、常量数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,如:if ( ... ) 等。运算符的空格规定如下:"::"、"->"、"["、"]"、"++"、"--"、"~"、"!"、"+"、"-"(指正负号)、"&"(引用)等几个运算符两边不加空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符"?:"两边均加一空格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。","运算符只在其后空一格,需对齐时也可不空或多空格。不论是否有括号,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。个人认为此项可以依照个人习惯决定遵循与否。
4.3 对齐 原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在","处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。 变量定义最好通过添加空格或TAB键形成对齐,同一类型的变量最好放在一起。如下例所示: int nValue; int nResult; int nLength;
4.4 空行 不得存在无规则的空行,比如说连续十个空行。程序文件结构各部分之间空一行,由于每个函数还要有函数说明注释,故通常只需空一行或不空,但对于没有函数说明的情况至少应再空一行。对自己写的函数,建议也加上“//------”做分隔。函数内部数据与代码之间应空至少一行,代码中适当处应以空行空开,建议在代码中出现变量声明时,在其前空一行。类中四个“p”之间至少空一行,在其中的数据与函数之间也应空行。
4.5 注释 注释是软件可读性的具体体现。程序注释量一般占程序编码量的20%,软件工程要求不少于20%。程序注释不能用抽象的语言,类似于"处理"、"循环"这样的计算机抽象语言,要精确表达出程序的处理说明。避免每行程序都使用注释,可以在一段程序的前面加一段注释,具有明确的处理逻辑。 注释必不可少,但也不应过多,不要被动的为写注释而写注释。以下是四种必要的注释: 标题、附加说明。 函数、类等的说明。对几乎每个函数都应有适当的说明,通常加在函数实现之前,在没 有函数实现部分的情况下则加在函数原型前,其内容主要是函数的功能、目的、算法等说明,参数说明、返回值说明等,必要时还要有一些如特别的软硬件要求等说明。公用函数、公用类的声明必须由注解说明其使用方法和设计思路,当然选择恰当的命名格式能够帮助你把事情解释得更清楚。
在代码不明晰或不可移植处必须有一定的说明。
及少量的其它注释,如自定义变量的注释、代码书写时间等。
5. 代码文件风格 所有的 Java(*.java) 文件都必须遵守如下的样式规则:
文件生成 对于规范的 JAVA 派生类,尽量用 eclipse工具来生成文件格式,避免用手工制作的头文件/实现文件。 package/import package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。
package hotlava.net.stats; import java.io.*; import java.util.Observable; import hotlava.util.Application; 这里 java.io.* 使用来代替InputStream and OutputStream 的。
文件头部注释 文件头部注释主要是表明该文件的一些信息,是程序的总体说明,可以增强程序的可读性和可维护性。文件头部注释一般位于 package/imports 语句之后,Class 描述之前。要求至少写出文件名、创建者、创建时间和内容描述。其格式应该尽量约束如下: /** *Title: 确定鼠标位置类 * Description: 确定鼠标当前在哪个作业栏位中并返回作业号 * @Copyright: Copyright (c) 2002 * @Company: HIT * @author: rivershan * @version: 1.0 */ Class 接下来的是类的注释,一般是用来解释类的。 /** *A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */ 接下来是类定义,包含了在不同的行的 extends 和 implements public class CounterSet extends Observable implements Cloneable Class Fields
接下来是类的成员变量: /** *Packet counters */ protected int[] packets; public 的成员变量必须生成文档(JavaDoc)。proceted、private和 package 定义的成员变量如果名字含义明确的话,可以没有注释。 存取方法 接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。(个人认为尽量分行写)
/** *Get the counters * @return an array containing the statistical data. This array has been * freshly allocated and can be modified by the caller. */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public int [] getPackets() { return copyArray(packets, offset); } public int [] getBytes() { return copyArray(bytes, offset); } public int [] getPackets() { return packets; } public void setPackets( int [] packets) { this .packets = packets; } |
其它的方法不要写在一行上 构造函数 接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。 访问类型("public","private" 等.)和任何"static","final"或"synchronized"应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。
public CounterSet(int size) {
this.size = size;
}
克隆方法 如果这个类是可以被克隆的,那么下一步就是 clone 方法: public Object clone() {
try {
CounterSet obj = (CounterSet)super.clone(); obj.packets = (int[])packets.clone(); obj.size = size; return obj;
} catch(CloneNotSupportedException e) {
throw new InternalError("Unexpected CloneNotSUpportedException: " + e.getMessage());
}
}
类方法 下面开始写类的方法:
/** *Set the packet counters * (such as when restoring from a database) */ protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4) throws IllegalArgumentException {
// // Ensure the arrays are of equal size // if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length) throw new IllegalArgumentException("Arrays must be of the same size"; System.arraycopy(r1, 0, r3, 0, r1.length); System.arraycopy(r2, 0, r4, 0, r1.length); } toString 方法 无论如何,每一个类都应该定义 toString 方法:
1
2
3
4
5
6
7
8
|
public String toString() { String retval = "CounterSet: " ; for ( int i = 0 ; i < data.length(); i++) { retval += data.bytes.toString(); retval += data.packets.toString(); } return retval; } |
main 方法 如果main(String[]) 方法已经定义了, 那么它应该写在类的底部。