编码规范.docx
《编码规范.docx》由会员分享,可在线阅读,更多相关《编码规范.docx(108页珍藏版)》请在冰豆网上搜索。
编码规范
软件编程规范
版权所有不得复制
目录
前言3
1.JAVA代码标准规则4
2.依据约定设计规则9
3.开发EJB规则11
4.代码书写格式规则12
5.垃圾回收规则16
6.初始化规则20
7.代码国际化规则22
8.Java注释规则27
9.其它杂项规则29
10.命名约定规则37
11.面向对象设计规则41
12.代码优化规则45
13.潜在的Bug规则52
14.线程和同步规则62
1.前言
软件编程规范的目的是为了统一公司软件编程风格,提高软件源程序的可读性、可靠性、和可重用性,提高软件源程序的质量和可维护性,减少软件维护成本,最终提高软件产品的生产力。
本规范主要是针对Java源程序。
内容主要包括JAVA代码标准规则、依据约定设计规则、开发EJB规则、代码书写格式规则、垃圾回收规则、全局静态分析规则、初始化规则、代码国际化规则、JAVA文档注释规则、类统计信息规则、其它杂项规则、命名约定规则、面向对象设计规则、代码优化规则、潜在的Bugs规则、有关线程规则、不合习惯的规则。
本规范对于显而易见的规则,没有列举示例说明。
本规范对统一网管平台项目组的JAVA源代码有约束力,对于由开发工具自动生成的源代码可以不约束。
本规范用到的术语解释如下:
规则:
编程时必须遵守的规则,是Jtest执行java项目测试的依据。
建议:
编程时必须加以考虑的原则,在JTest测试过程中不强行做检查。
说明:
对相应规则的必要的解释
正例:
对此规则或建议给出的修正后的例子
反例:
对此规则或建议给出的反面的例子
2.JAVA代码标准规则
【规则2_1】赋值语句避免嵌套赋值,避免在一条语句中将一个数值赋给多个变量,提高代码可读性。
反例:
intmethod(inti,intj)
{
intk=(i=i+j)+j;//违例
returnk;
}
正例:
intmethod(inti,intj)
{
i=i+j;//正确
intk=i+j;//正确
returnk;
}
【规则2_2】声明字符串对象时避免使用new保留字,避免资源浪费。
反例:
voidmethod()
{
System.out.println(_s);
}
privateString_s=newString("ACDO");
正例:
voidmethod()
{
System.out.println(_s);
}
privateString_s="ACDO";//正确
【规则2_3】避免在一个声明语句中声明多个不同类型变量,比如一个整型变量,一个整型变量数组;避免在一个声明语句中声明多个变量,同时方便注释。
(与公司规范5-1相同)
反例:
classVDT{
privateintindex,index1[];//违例:
一个整型,一个整型数组
publicvoidmethod()
{
intaaa,bbb[];//违例:
一个整型,一个整型数组
intccc;
intddd;
}
}
classMVOS{
Strings1,s2;//违例:
同一个声明语句声明两个变量
publicMVOS()
{
s1="hello";
s2="world";
}
}
正例:
classVDT{
privateintindex,
privateindex1[];//正确
publicvoidmethod(){
intaaa,
intbbb[];//正确
intccc;
intddd;
}
}
classMVOS{
Strings1;//正确
Strings2;//正确
publicMVOS(){
s1="hello";
s2="world";
}
}
【规则2_4】声明长整形long变量时,结尾用大写字母”L”代替小写字母”l”,避免和数字”1”混淆,提高代码可读性。
【规则2_5】避免在抽象类构造函数中调用抽象方法。
说明:
抽象类构造函数中调用抽象方法将导致在对象析构之前使用其方法,导致异常发生。
反例:
abstractclassNCAC{
publicNCAC(){
System.out.println("Constructor:
");
test();//违例
}
abstractpublicvoidtest();
}
正例:
abstractclassNCACFixed{
publicNCACFixed(){
System.out.println("Constructor:
");//正确
}
abstractpublicvoidtest();
}
【规则2_6】如果类所有的方法和属性都是静态(static)的,那么要定义缺省的构造器,并且应该是私有(private)的,提高类的封装性。
反例:
publicclassUCC{
publicUCC(){}//违例
publicstaticStringgetS(){
returns;
}
publicstaticStrings="foo";
}
正例:
publicclassUCDCFixed{
privateUCDCFixed(){}//正确
publicstaticStrings="foo";
publicstaticStringgetS(){
returns;
}
}
【规则2_7】用大写标识符静态变量替代数字常量,避免直接使用数字常量,提高代码可读性。
说明:
指定的常量(final,static变量)的采用可以使得代码更容易被理解与维护当代码中使用如下的整型常量时,Jtest不报错:
-1,0,1,2,3,4,5,6,7,8,9,10
反例:
classUSN{
int[]getArray(){
returnnewint[1000];//违例
}
}
正例:
classUSNFixed{
int[]getArray(){
returnnewint[ARRAY_SIZE];//正确
}
privatestaticfinalintARRAY_SIZE=1000;
}
【规则2_8】函数重载要集中在一起声明,提高代码可读性。
反例:
publicclassOGM{
voidfoo(){}
voidbar(){}
voidbab(){}
voidfoo(inta){//违例
}
}
正例:
publicclassOGM{
voidfoo(){}
voidfoo(inta){//正确
}
voidbar(){}
voidbab(){}
}
【规则2_9】定义扩展Exception类的异常,避免直接抛出Exception类异常,防止可能的捕获不到某些异常。
反例:
publicclassNTX{
voidlostDetailsTest()throwsException{//违例
try{
thrownewjava.io.IOException("IOexception");
}
}
正例:
publicclassNTXFixed{
voidlostDetailsTest()throwsjava.io.IOException{//正确
try{
thrownewjava.io.IOException("IOexception");
}
}
【规则2_10】如果一个方法没有使用任何实例类成员,包括方法和字段,那么就把方法声明为静态的,提高代码的封装性。
反例:
publicclassASI{
publicintadd(inti,intj){//违例
returni+j;
}
}
正例:
publicclassASIFixed{
publicstaticintmethod(inti,intj){//正确
returni+j;
}
}
【规则2_11】如果类声明中有main方法,则把其放在类的最后。
【规则2_12】把数字常量放在if比较表达式的右边。
【规则2_13】在一个独立的方法中,使用”!
”运算符不允许多于三次,提高代码的可读性。
反例:
publicclassDUN{
booleanmethod(booleana,booleanb){//违例
if(!
a)
return(!
a&&!
b);
else
return!
b;
}
}
正例:
publicclassDUNFixed{
booleanmethod(booleana,booleanb){
if(a)
return!
b;
else
return(!
(a||b));
}
}
【建议1_15】对于一个子系统的代码,在一个接口中定义所有常量,提高代码的可维护性。
说明:
在一个类定义所有常量和在一个接口中定义所有常量没有什么区别,由用户来决定。
反例:
classDCI{
intgetMax(){
returnMAX;
}
staticfinalintMAX=1000;//违例
}
正例:
classDCI{
intgetMax(){
returnConstants.MAX;
}
}
interfaceConstants{
intMAX=1000;
}
3.依据约定设计规则
【规则3_1】注释说明应与代码保持一致,去掉无关的注释。
反例:
publicclassSYNTAX{
/**@throwsanioexception*///违例
FileInputStreamopenFile(Stringpath)
throwsjava.io.IOException{
//...
}
/**@throwsnoexceptions*///违例
staticvoidmethod(){
}
}
正例:
publicclassSYNTAXFixed{
/**@throwsIOException*///正确
FileInputStreamopenFile(Stringpath)
throwsIOException{
System.in.read();
}
/**@throws$none*///正确
staticvoidmethod(){
}
}
4.开发EJB规则
【规则4_1】会话Bean类必须定义成public型,这是Sun公司Java组的约定。
【规则4_2】EJB类不能定义成abstract、final、static型,这是Sun公司Java组的约定。
【规则4_3】EJB类中至少有一个ejbCreate()方法,并且是public型,不能有static或final保留字,这是Sun公司Java组的约定。
【规则4_4】在EJB相应的Bean类里面至少处理一个ejbCreate()方法。
【规则4_5】在EntityBean类里面至少处理一个'ejbPostCreate()’方法,并且有public保留字。
【规则4_6】在Bean类里面,不允许定义finalize()方法。
【规则4_7】Finder方法必须返回主键值或主键集合值。
【规则4_8】会话Bean的ejbCreate()方法返回值必须是void型。
【规则4_9】不允许引用this参数,不允许返回this型。
说明:
Sun公司Java开发组的约定。
【规则4_10】不允许修改和编辑安全配置对象。
说明:
Sun公司Java开发组的约定,这是出于安全方面的考虑。
【规则4_11】在Bean类中不允许装载本地库。
说明:
Sun公司Java开发组的约定,这是出于安全方面的考虑。
【规则4_12】避免使用线程。
说明:
Sun公司Java开发组的约定,EJB服务器负责管理EJB的调度和部署,同时也是出于安全方面的考虑
【规则4_13】避免使用java.io、java.awt包。
5.代码书写格式规则
每一个Java源文件都包括一个公共的类或接口。
当私有类或接口与公共类相关联的时候,通常可以将其与公共类放在同一个源文件当中。
公共类应是文件中的第一个类或接口。
类或接口的各部分代码顺序如下:
ØClass或Interface文档型注释
采用/**
*
*
*/型注释。
ØClass或Interface声明
ØClass或Interface的实现声明
该段注释中应该包括任何与类和接口有关的,但又不适于放在文档注释区中的注释说明。
Ø类变量及变量实例
变量出现的顺序为,首先公共变量,然后protected变量,然后是包package一级的变量,然后是私有变量。
Ø构造函数(Constructors)
Ø方法finalize(),如果有。
Øpublic方法
Øprotected方法
Øprivate方法
Øprivate字段
【规则5_1】源代码文件(.java)的布局顺序是:
包、import语句、注释、类。
正例:
packagecom.zte;
importjava.awt.peer.CanvasPeer;
importjava.io.*;
importcom.zte.ums.uep.*;
/**
*
文件名称:
题目名称
*
文件描述:
本类描述
*
版权所有:
版权所有(C)2001-2004
*
公司:
深圳市中兴通讯股份有限公司
*
内容摘要:
//简要描述本文件的内容,包括主要模块、函数及其功能的说明
*
其他说明:
//其它内容的说明
*
完成日期:
//输入完成日期,例:
2000年2月25日
*
修改记录1:
//修改历史记录,包括修改日期、修改者及修改内容
*
*修改日期:
*版本号:
*修改人:
*修改内容:
*
*
修改记录2:
…
*@version1.0
*@author作者姓名
*/
【规则5_2】遵循统一的布局顺序来书写import语句。
不同类别的import语句之间用空行分隔。
说明:
package语句其后可跟import语句,而且与package间隔一个空行。
import包的排列顺序为java开头的包在最前面,接下来是引自外部的包,再接下来是应用程序自身的包,即import中标准的包名要在本地的包名之前,而且按照字母顺序排列。
如:
正例:
packagecom.zte;
importjava.awt.peer.CanvasPeer;//java自身的包
importjava.io.*;
importcom.klg.field.*;//第三方的包
importcom.zte.ums.uep.*;//程序自身的包
【规则5_3】每行只有一个句子,提高代码可读性。
反例:
publicclassOSPL{
intmethod(inta,intb){
inti=a+b;returni;//违例
}
}
正例:
publicclassOSPLFixed{
intmethod(inta,intb){
inti=a+b;//正确
returni;//正确
}
}
【规则5_4】每行不能超过120个字符。
【规则5_5】源文件有头注释,注明作者、版权、版本信息,提高代码可维护性。
正例:
/**
*
文件名称:
题目名称
*
文件描述:
本类描述
*
版权所有:
版权所有(C)2001-2004
*
公司:
深圳市中兴通讯股份有限公司
*
内容摘要:
//简要描述本文件的内容,包括主要模块、函数及其功能的说明
*
其他说明:
//其它内容的说明
*
完成日期:
//输入完成日期,例:
2000年2月25日
*
修改记录1:
//修改历史记录,包括修改日期、修改者及修改内容
*
*修改日期:
*版本号:
*修改人:
*修改内容:
*
*
修改记录2:
…
*@version1.0
*@author作者姓名
*/
【规则5_6】“}”一定独占一行,并且它们后面都没有语句。
【规则5_7】用空格(4个空格)替代tab键,4个空格为一缩进单位,避免不同编辑器之间的差异而导致代码布局混乱。
【规则5_8】长表达式(超过120列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。
拆分出的新行要进行适当的缩进,使排版整齐。
说明:
断行方法:
1.在逗号后断行
2.在操作符前断行
3.较高级别断行优于较低级别的断行
对齐方法:
1.将新行与同一级别的先前行的表达式的起始端对齐。
2.条件表达式的续行在第一个条件处对齐。
3.for循环语句的续行在初始化条件语句处对齐。
4.函数调用和函数声明的续行在第一个参数处对齐。
5.赋值语句的续行应在赋值号处对齐。
6.如果上述规则导致代码排列混乱或代码左边界少于两个宿进,可用两倍宿进替代。
下面是一些断行方法调用的示例:
正例:
someMethod(longExpression1,longExpression2,longExpression3,
longExpression4,longExpression5);
var=someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
下面是两个断行算术表达式例子,第一个是优选方法,因为断行出现在括号表达式之外,属于较高级别的断行。
正例:
longName1=longName2*(longName3+longName4-longName5)
+4*longname6;//允许的断行方法
反例:
longName1=longName2*(longName3+longName4
-longName5)+4*longname6;//应该避免的断行方法
下面是两个缩排方法的例子,第一个是传统的方式,第二个例子中如果采用传统方式缩排将导致第二行和第三行右边出现太多空白,因此,采用8个空格符替代。
//传统的缩排方法,第二行与第一行的括号对齐。
正例:
someMethod(intanArg,ObjectanotherArg,StringyetAnotherArg,
ObjectandStillAnother){
...//你代码的位置
}
//由8个空格符来替代与括号对齐的方法,以避免第二行、第三行出现太多的空格符
正例:
privatestaticsynchronizedhorkingLongMethodName(intanArg,
ObjectanotherArg,StringyetAnotherArg,
ObjectandStillAnother){
...//你代码的位置
}
对于if语句的行封装通常使用8空格规则,因为传统的4空格缩排方式使得有些语句容易被忽略掉,使if语句体难以理解。
例如:
反例:
//不允许使用下面的缩进方法
if((condition1&&condition2)
||(condition3&&condition4)
||!
(condition5&&condition6)){//不好的封闭
doSomethingAboutIt();//这样对齐的封闭很容易让阅读的人忽略掉这一行
}
正例:
//宜采用下面的缩进方法(分成三行的情况)
if((condition1&&condition2)
||(condition3&&condition4)
||!
(condition5&&condition6)){
doSomethingAboutIt();
}
//或使用下面的缩进方法(分成二行的情况)
正例:
if((condition1&&condition2)||(condition3&&condition4)
||!
(condition5&&condition6)){
doSomethingAboutIt();
}
对于三重表达式,有三种方式可以对它进行格式化:
正例:
//单行的情况
alpha=(aLongBooleanExpression)?
beta:
gamma;
//分成两行的情况,第二行的冒号与第一行的问号对齐。
alpha=(aLongBooleanExpression)?
beta
:
gamma;
//分成三行的情况,第二行的问号和第三行的冒号都与第一行的括号对齐
alpha=(aLongBooleanExpression)
?
beta
:
gamma;
【规则5_9】声明数组时”[]”放在数组变量的前面,这和C/C++正好相反。
反例: