fJAVA编码规范.docx
《fJAVA编码规范.docx》由会员分享,可在线阅读,更多相关《fJAVA编码规范.docx(22页珍藏版)》请在冰豆网上搜索。
fJAVA编码规范
密级:
内部公开
文档编号:
XXXXX_SD_PROC_JAVABMGF
版本号:
V1.0
Java编码规范
编制:
生效日期:
审核:
批准:
变更记录
变更序号
变更原因
变更页码
变更前版本号
变更后版本号
更改人
批准人
生效日期
备注
1
文档建立
(注:
重要部分采用了蓝色文字标记)
目录
1.原则约定3
1.1.抽象依赖原则3
1.2.接口隔离原则3
1.3.单一职责原则3
1.4.编写伪代码3
1.5.泛型的使用3
1.6.Annotation使用3
1.7.异常的处理4
1.8.Final关键字4
1.9.工具类的使用4
1.10.控制层开发注意4
1.11.业务逻辑层开发注意4
1.12.数据访问层开发注意4
2.编码细节5
2.1.数组指示符紧跟类型变量5
2.2.避免长的布尔表达式5
2.3.避免条件语句中执行方法5
2.4.三元条件运算符5
2.5.条件语句/循环体主要形式5
2.6.switch语句的使用格式6
2.7.代码的长度6
2.8.代码的缩进6
2.9.空格的使用7
2.10.空行的使用7
3.注释规范7
3.1.基本原则7
3.2.包8
3.3.类、接口注释8
3.4.方法注释8
3.4.常量,变量8
3.5.其他注释8
4.命名规则9
4.1.基本原则9
4.2.java命名9
4.2.1.包9
4.2.2.类9
4.2.3.抽象类,接口9
4.2.4.常量10
4.2.5.变量和参数10
4.2.6.数组的命名10
4.2.7.方法10
4.3.数据库命名11
4.3.1.基本规则:
11
4.3.2.表名11
4.3.3.字段:
11
4.3.4.主键:
11
4.3.5.外键:
11
4.4.JSP/HTML命名12
5.声明规范12
5.1.基本原则12
5.2.方法13
5.3.字段13
附1:
常用缩写简表13
附2:
匈牙利命名法14
1.原则约定
1.1.抽象依赖原则
抽象依赖原则(稳定依赖原则)。
应该依赖于抽象而不依赖与具体类,抽象的类和接口是稳定的,而具体类是易变的,如果依赖于具体类,代码就会非常脆弱,失去了灵活性。
1.2.接口隔离原则
一个类对另外一个类的依赖应该建立在最小的接口之上的。
1.3.单一职责原则
如果一个类有多于一种的职责,当需求变化时,类的职责就要发生变化,而因此就会引起引用该类的代码发生改变,职责越多,这个类就容易跟更多的类产生耦合关系,而且改变一个职责,可能会影响到另外一个职责的履行。
1.4.编写伪代码
编写代码前,先编写注释(可以认为是伪代码),先想后写。
/**
*报表构建器,主要职责:
*1.创建拷贝报表模版
*2.填充报表数据
*3.构建报表
*4.画图处理
*/
1.5.泛型的使用
集合框架工具类使用的时候,尽量使用泛型,限制类型。
1.6.Annotation使用
1.6.1.重载方法应该使用@Override,可避免父类方法改变时导致重载函数失效
1.6.2.不要让警告出现。
不需要关心的warning信息用@SuppressWarnings("unused"),@SuppressWarnings("unchecked"),@SuppressWarnings("serial")注释。
1.7.异常的处理
1.7.1.重新抛出的异常必须保留原来的异常信息。
1.7.2.如果异常被捕获,则不应该再出现在抛出异常的声明中。
1.7.3.在所有异常被捕获且没有重新抛出的地方必须写日志
1.7.4.如果属于正常异常的空异常处理块须注释说明,否则不允许空的catch块。
1.8.Final关键字
1.8.1.对一些基本数据类型和不太可能通过继承进行扩展的类
1.8.2.作为参数,在方法体内不会发生变化或修改,要考虑声明为final
1.9.工具类的使用
1.9.1.首先尽量使用apache组织开源项目下的一些通用工具包
1.9.2.其次使用公司基础框架中定义的工具类
1.9.3.再次没有满足需求的工具类时,才自己定义。
1.10.控制层开发注意
1.10.
1.10.1.在页面中尽量不用action名+"!
"+方法名去调用用webwork的action方法
1.10.2.webwork的action配置统一,即每一个action方法一个action配置
1.10.3.action方法中尽量不要写逻辑代码,应该放到service层实现类方法中
1.11.业务逻辑层开发注意
1.
1.9.
1.10.
1.10.1.service层实现类方法参数要校验,建议使用Spring的Assert系列函数。
1.10.2.方法定义的颗粒度要适当。
1.10.3.对于数据库有写操作的必须增加事务支持。
1.12.数据访问层开发注意
1.11.
1.12.
1.12.1.DAO层实现类尽量不要写逻辑代码,单纯的数据库操作(逻辑应放到service层实现类方法中)。
1.12.2.使用Spring提供的jdbcTemplate时,应该酌情考虑使用JdbcTemplate还是SimpleJdbcTemplate
2.编码细节
2.
2.1.数组指示符紧跟类型变量
int[]a=newint[20];
//避免:
inta[]=newint[20];
2.2.避免长的布尔表达式
//应换成多个更容易理解的表达式
boolisFinished=(elementNo<0)||(elementNo>maxElement);
boolisRepeatedEntry=elementNo==lastElement;
if(isFinished||isRepeatedEntry){
…
}
//避免
if((elementNo<0)||(elementNo>maxElement)||elementNo==lastElement){
…
}
2.3.避免条件语句中执行方法
InputStreamstream=File.open(fileName,"w");
if(stream!
=null){
…
}
//避免
if(File.open(fileName,"w")!
=null)){
…
}
2.4.三元条件运算符
可以使用如下三种表达方式,条件要用括号括起来。
alpha=(aLongBooleanExpression)?
beta:
gamma;
2.5.条件语句/循环体主要形式
即使单条语句,或者没有语句也要使用括号括起来。
例如:
if(condition){
statements;
}elseif(condition){
}else{
statements;
}
for(initialization;condition;update){
}
2.6.switch语句的使用格式
switch(condition){
caseABC:
statements;
//穿透,一定要做出注释
caseDEF:
statements;
break;
caseXYZ:
statements;
break;
default:
statements;
break;
}
2.7.代码的长度
a)不要使用Eclipse自带的代码Format操作,那会让代码可能性降低。
b)单个函数的有效代码长度当尽量控制在100行以内(不包括注释行)。
c)单个类的长度包括注释行不超过1500行。
页宽应该设置为100字符(选)。
2.8.代码的缩进
应该使用4个空格或者一个TAB键为一个单位进行缩进,例如:
publicStringinvoke()throwsException{
StringprofileKey="invoke:
";
try{
UtilTimerStack.push(profileKey);
if(executed){
test=true;
}
}catch{
…
}
}
2.9.空格的使用
有空格会让代码可读性提高,更整齐美观。
a)运算符两边应该各有一个空格。
b)Java保留字后面应跟随一个空格。
c)逗号后面应跟随一个空格。
d)冒号两个应各有一个空格。
e)分号后面应跟随一个空格。
a=(b+c)*d;//NOT:
a=(b+c)*d
while(true){//NOT:
while(true){...
doSomething(a,b,c,d);//NOT:
doSomething(a,b,c,d);
case100:
//NOT:
case100:
for(i=0;i<10;i++){//NOT:
for(i=0;i<10;i++){...
2.10.空行的使用
a)文件头部注释、package语句和import语句之间。
b)class之间
c)方法之间
d)方法中,变量的申明和具体代码之间。
e)逻辑上相关的语句段之间
f)块注释和行注释的前面
逻辑上紧密相关的代码块应该用一个空行分开。
3.注释规范
3.1.基本原则
a)注释的内容,要真正能起到作用,不能为了注释为注释,简单的去拷贝被人注释是不允许的。
b)注释的格式要尽量使用Html格式书写。
例如使用
使用转义字符>表示>
c)接口方法的注释要能体现出该接口的作用,使用范围,输入输出。
d)实现方法的注释要能体现出,具体的实现,尽量详细,让别人能知道你的实现思路,有助于发现问题。
3.2.包
Web程序对于包的命名比较统一,相对都比较容易理解。
如果有需要注释的包,应该在package前面加以注释,注释内容应该包含,包的作用、核心类、工具类、与其他模块有怎样的关联。
3.3.类、接口注释
在类、接口定义之前当对其进行注释,包括类、接口的目的、作用、功能、继必要的实现算法、提供的使用方法、作者、示例程序等。
源文件的头部需要一个history段,对于每次对源文件的重大改动,都需要在history段中注明。
例如:
/**
*类文件说明:
*
*@authoryuan
*@date2007-12-19上午09:
57:
01
*history
*2007/06/01Biz创建文件
*2007/06/19kevin增加提示功能
*/
3.4.方法注释
依据标准JavaDoc规范对方法进行注释,以明确该方法功能、作用、各参数含义以及返回值等。
复杂的算法用/**/在方法内注解出。
/**
*作用:
*
*@param####
*@return####
*@throws####
*/
3.4.常量,变量
重要的变量要加以注释,以说明其含义等
3.5.其他注释
a)过长的方法实现,应将其语句按实现的功能分段加以注释概括说明。
b)分支条件表达式应该加注释,非常简单明了的除外。
4.命名规则
4.1.基本原则
a)所有包,类,接口,方法,属性,变量,参数均使用英文单词进行命名。
b)命名包,类,接口,方法以及变量时,尽量使用贴近问题域的表意丰富的名称。
c)采用大小写混合,提高名字的可读性。
一般应该采用小写字母,但是类和接口的名字的首字母,以及任何中间单词的首字母应该大写。
包名全部小写。
d)尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等,具体参看附录之《常用缩写简表》,严禁滥用缩写。
e)避免使用长名字(最好不超过25个字母)。
f)避免使用数字,但可用2代替to,用4代替for等,如:
go2Jsp。
g)名字可以有两个或三个单词组成,但不应多于三个,变量名称必须大于等于3个字符(循环变量除外)。
4.2.java命名
4.2.1.包
包名一律小写,不能含有大写字母,不要出现下划线等符号,一般以项目或模块名命名,少用缩写和长名,尽量使用单个单词。
此外,对于包名我们做如下约定:
1.工具函数类包名前缀为.util
2.Action类包名前缀为.action
3.domain类包名前缀为.domain
4.service类包名前缀为.service
5.dao类包名前缀为.dao
6.dao和service的实现包名前缀为.impl
7.testcase类包名前缀为.test
4.2.2.类
类的的名字所有单词第一个字母大写,其他字母小写。
eg:
UserManager,ClassLoader,HttpHeaderResult
类的申明中要一个缺省的构造函数
4.2.3.抽象类,接口
对于抽象类,应该使用Abstract前缀。
eg:
AbstractReportBuilder,AbstractBeanFactory
为了基于接口编程,建议采用母为I为前缀的,其实现类使用Impl后缀的命名方式。
例如:
接口命名为:
IBookDAO,其实现类命名为:
BookDAOImpl
4.2.4.常量
常量,采用完整的英文大写单词,在词与词之间用下划线连接。
4.2.5.变量和参数
1.名字除了第一个单词,所有单词第一个字母大写,其他字母小写。
2.对不易清楚识别出该变量类型的变量应使用类型缩写作其前缀,如字符串使用strXXX,boolean使用isXXX,hasXXX等等.
3.方法的参数使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字.
4.2.6.数组的命名
数组应该总是用下面的方式来命名:
byte[]buffer;
而不是:
bytebuffer[];
4.2.7.方法
1.方法名应该使用动词开头,一般由动词+名词组成。
方法的命名应采用完整的英文描述符,大小写混合使用:
所有中间单词的第一个字母大写。
方法名称的第一个单词常常采用一个有强烈动作色彩的动词。
eg:
getName,initialize,addParameter,deleteUser
尽量可由函数名得知函数功能,尽量写全,减少缩写
缩写字母也应该保持首字母大写
exportHtmlSource();//避免:
exportHTMLSource();
openDvdPlayer();//避免:
openDVDPlayer();
2.变量的名字应该和类型名称一致
voidsetTopic(Topictopic)
//避免:
voidsetTopic(Topicvalue)
//避免:
voidsetTopic(TopicaTopic)
//避免:
voidsetTopic(Topict)
voidconnect(Databasedatabase)
//避免:
voidconnect(Databasedb)
//避免:
voidconnect(DatabaseoracleDB)
3.当同时定义多个属于同一个类的变量时,把类型作为实例的后缀,如:
PointstartPoint;
PointcenterPoint;
4.使用is前缀表示一个布尔变量和方法。
isUsed,isEmpty,isVisible,isFinished
有时也可以使用has,can,should:
booleanhasLicense();
booleancanEvaluate();
booleanshouldAbort=false;
5.在查询方法中应使用find作为前缀
6.在更新方法中应使用update作为前缀
7.在删除方法中应使用delete作为前缀
8.在增加方法中应使用insert作为前缀
9.使用init做为对象初始化的方法前缀,也可以简写为init
init();
initializeFiles();
initFontSet();
10.对于表示编号的变量,应加No后缀。
tableNo,userNo,employeeNo
11.避免使用否定布尔变量
booleanisError;//避免:
isNoError
booleanisFound;//避免:
isNotFound
4.3.数据库命名
4.3.1.基本规则:
1.所有名称以字母及“_”符号组合而成,其它符号禁止使用。
2.表名称,字段名称必须大写。
3.表名、字段名不允许超过15个单词。
4.ORACLE数据库的常用表字段类型:
NUMBER、DOUBLE、VARCHAR2()、CLOB、BLOB等,其它字段谨慎使用。
5.PD中的设计表、字段必须注释说明
6.数据库采用NUMBER
(1)类型表达JAVA中的BOOLEAN类型,1为true,0为false,命名采用肯定是命名
eg:
isValid//notisNotValid
7.ORACLE数据库采用NUMBER(14)类型存储的格式为20100408233310表示日期类型
4.3.2.表名
表名构成:
前缀(系统简称)+”_”+模块名称+”_”+对象名称(英文单词或英文缩写),例如表:
PW_AUTH_USER
4.3.3.字段:
采用有意义的单词拼凑需成。
单词之前用“_”分隔,应尽量避免字段带表名。
例如:
表明叫做RH_SYS_USER,有一个名称属性,给字段命名时应该叫NAME,最好不要叫做USER_NAME
4.3.4.主键:
所有表中都需含有代理主键字段,建议统一命名为:
ID;
4.3.5.外键:
[表名ID]
例:
用户角色表中有用户ID字段。
命名方式为:
USER_ID
存在主外键关系的,根据使用持久框架来决定:
如果使用类似HibernateORM持久工具,关系建议交给程序配置文件来建立,
使用JDBC则必须建立
4.4.JSP/HTML命名
1.文件夹命名应该使用英文单词,不能超过3个单词,除第一个单词首字母外,其他单词均小写并且首字母大写,尽量不包含数字或者下划线。
如果单词超过3个则应该采用规范的缩写。
2.页面逻辑(JSP)名称=操作对象名称+操作方法名,使用匈牙利命名法.