开发规范java.docx
《开发规范java.docx》由会员分享,可在线阅读,更多相关《开发规范java.docx(10页珍藏版)》请在冰豆网上搜索。
开发规范java
开发规范(JAVA)
1编写目的
统一开发规范,提升代码质量和今后代码的可维护性。
2通用原则
2.1保持代码风格一致
遵守以下三点有助于风格一致,提高代码可读性。
1.在新增代码时,遵守本规范。
2.在重构已有代码时,遵守本规范。
3.在维护已有代码时,保持其原有风格不变。
2.2提高代码的健壮性
程序代码应该在正确的输入的情况下正确执行,在错误的输入情况下给予适当错误提示,不可产生损害系统稳定性的行为(如文件系统的关闭)。
3文件编写的规定
3.1Java文件编写规定
3.1.1包命名
包命名一律小写,包名应根据模块机构有一定语义,并遵循“Java程序包结构”中的规则定义。
3.1.2类命名
1、Class的名字必须由大写字母开头,采用驼峰式的命名方式即每个词汇首字母大写而其他字母都小写的单词组成。
类命不可包含下划线。
2、Class名字的形式一般应为:
[形容词+]名词,且名词为单数形式:
例如:
RuleEngine、AbstractRuleActionException
3、Interface名字一律以”I”开头,形式一般应为:
I+[副词+]形容词,或I+[形容词+]名词:
例如:
IXmlJavaConvertible,IRuleDS
4、对于实体层,实体类命名一律采取“****Model”的形式,“***”为对应的实体表的名字(不包括模块前缀)。
如:
审计项目信息表名为PM_ProjectInfo,则对应的实体类命名“ProjectInfoModel”。
注意:
实体类应该与后台实体表一一对应。
5、对于持久化层,持久化类命名一律采取“****Persistence”的形式,“***”为对应的实体表的名字(不包括模块前缀)。
如:
审计项目信息表名为PM_ProjectInfo,则对应的实体类命名“ProjectInfoPersistence”。
注意:
持久化类常常与实体类相对应。
6、对于业务服务层,服务类命名一律采取“****Service”的形式,“***”为对应的业务模块功能点的名字。
如:
审计项目模块中关于项目信息维护的功能命名为ProjectInfo,则对应的服务类命名“ProjectInfoService”。
注意:
服务类应该封装了尽可能多的业务逻辑。
特别,需要进行事务管理的逻辑应放在一个服务方法里。
7、对于管理器层(门面层),管理器类命名一律采取“****Manager”的形式,“***”为对应的业务模块的名字,即管理的对象名字。
如:
审计项目模块中项目管理的功能命名为Project,则对应的管理器类命名“ProjectManager
注意:
管理器类只是界面层与逻辑层的访问接口,只起到门面的作用,不应包含太多业务逻辑,只作简单内存处理操作。
8、对于界面层:
1)View命名一律采用Java类的命名名字必须由大写字母开头,采用驼峰式的命名方式即每个词汇首字母大写而其他字母都小写的单词组成不可包含下划线。
2)View实现类命名一律采取“****ViewModel”的形式,“***”为对应的View的名称。
如:
审计项目模块中项目信息维护录入的功能命名为ProjectInfo,则对应的界面类命名“ProjectInfoViewModel”。
3)Listener命名一律采取Dorado自动生成名称。
4)Dataset命名一律采取“dataset***”的形式,“***”为对应Model或者具有数据含义的名称。
如:
“项目信息”对应的dataset命名为“datasetProjectInfo”。
5)其他页面组件命名一律采取“组件名称****”,“***”为对应具体的操作,或者具有该组件含义的名称。
如“项目信息表格”对应的table命名为“tableProjectInfo”。
JavaScirpt代码编写风格与“本Java文件编写规定保持一致”。
6)JSP命名一律采用自动生成名称。
注意:
界面类只是承载的用户访问界面的逻辑,最多包含界面元素参数获取或者准备的逻辑,不应包含业务逻辑。
3.1.3方法命名
1、方法名字的形式一般应为下列三种形式的一种:
a)[副词]+动词
b)动词+名词
c)is+形容词
2、第一个词汇全部小写,(多个词汇时)其余词汇首字母大写,首尾相连。
3、新增方法编写规范:
方法名以add打头+要新增的实体类名,参数为新增的实体对象,返回新增成功后的实体对象。
如:
public***Modeladd***Model(***Modelmodel)
4、修改方法编写规范:
方法名以update打头+要修改的实体类名,参数为修改的实体对象,返回修改成功后的实体对象。
如:
public***Modelupdate***Model(***Modelmodel)
5、删除方法编写规范:
方法名以delete打头+要删除的实体类名,参数为要删除的实体对象的主键,返回void。
如:
publicvoiddelete***Model(Stringid)
6、查询方法编写规范:
方法名以find打头+要查询的对象[+By+查询条件1_查询条件2],参数为查询条件,返回List
如:
publicListfind***Models(Objectparam1,……,ObjectparamN)
若查询参数少于3个,还可以采取以下格式:
PublicListfind***MordelsByParam1_Param2
(Objectparam1,Objectparam2)
3.1.4变量命名
1.变量的名字必须用一个小写字母开头。
后面的单词用大写字母开头.例如‘infoName’、‘createDate’。
2.变量的命名要有一定语义,且带有简单注释,严禁用类似于“aaa”、b1”这样的变量名。
3.StaticFinal变量都为public的,且名字应该都大写,并指出完整含义。
4.参数的名字必须和变量的命名规范一致。
3.1.5注释
1、类头的注释
/**
*类描述
*author:
yangshq
*Date:
2006-9-13
*Time:
21:
19:
42
*/
2、方法头的注释
/**
*方法描述
*@param参数1:
参数1描述
*@param参数n:
参数n描述
*@return返回值类:
返回值描述
*@throws抛出的例外:
抛出的例外描述
*/
3、成员变量的注释
采用下面的格式:
/**
*MemberDescription
*/
局部变量的注释
单行注释(//)说明其含义
4、代码逻辑的注释
在方法内,在需要的地方用单行注释说明代码的逻辑。
特别地,当方法内逻辑有分支或出现“{}”程序块时,一定要进行注释。
例如:
……
if(……){
//注释
……
}else{
//注释
……
}
for(…………){
//注释
……
}
5、对于程序中待处理内容的注释说明
我们的程序中有时会出现一些待处理的逻辑或者待实现的接口,这里我们规定对于这样的地方,一律用“//TODO待处理内容描述”的方式进行注释。
3.1.6其他
3.2Jsp文件编写规定
3.2.1文件命名
Jsp页面的命名要有语义,小写字母打头,之后采用驼峰式命名法。
3.2.2注释
1.在需要说明注释的地方,用
--说明描述-->来进行注释。
2.页面上每段较为单一的显示区(或者用
分开的区域)的头尾都用:
“
—startof***区域-->”和“
—endof***区域-->”
来注释说明开始和结束。
例如:
…………
--startoflistTablearea-->
--endoflistTablearea-->
……
3.2.3其他
尽量在jsp页面中不写java代码,让jsp只起显示的作用。
控制逻辑都放到相应的逻辑处理模块(java)中。
3.3Xml文件编写规定
3.3.1文件命名
若有自定义的Xml文件,命名一律小写,用“-”连接语义词汇。
3.3.2注释
对应于一个功能模块的配置,在代码的头尾加如下注释:
--startof**/***/**/**moduleby编写人-->
…………
--endof**/***/**/**moduleby编写人-->
3.4Perporties文件编写规定
3.4.1文件及属性命名
若有自定义的Perporties文件命名一律小写打头,之后采取驼峰式命名法。
3.4.2文件中常量命名
模块名.功能点名.常量名=常量值
3.4.3注释
对应于一个功能模块的配置,在代码的头加如下注释:
#**/***/**/**moduleby编写人
4关于程序开发中的特殊处理规范
4.1删除操作
系统中所有删除按钮,都需要弹出confirm确认框。
4.2关于main方法
在每个管理器***Manager中,都配备main方法,以测试其中的每个供前台界面调用的方法。
4.3Jsp文件的初始处理
【建议】:
每个模块(或者项目)都尽量设定一个init.jsp文件,来include或者定义一些公共代码,例如:
<%@includefile="/html/common/init.jsp"%>
defineObjects/>
<%
PortletPreferencesprefs=renderRequest.getPreferences();
%>
其他的每个jsp都要添加这个公共init文件。
4.4页面输入验证及报错
通过统一编写validate.js,将所有的js校验函数都写到该文件中。
在每个jsp页面中,对输入内容进行校验大致包括:
日期校验、数字校验、名称校验、非空校验等。
所有这些校验都统一调用validate.js中的统一的函数。
4.5例外处理
声明的错误应该抛出一个RuntimeException或者派生的异常。
1.持久化层:
异常不捕获,直接往上层即服务层抛;
2.服务层:
异常捕获,根据需要进行处理,打印信息,接着往上层即管理器层抛;
3.管理器层:
异常不捕获,继续往上抛,即抛到界面层;
4.界面层:
捕获异常,并在界面上有对应的用户提示。
4.6关于系统日志的记录(log4j)
1、log4j主要用于调试程序使用,在程序中绝不要把system.out用于日志记录。
控制台输出无法被配置。
例如,我们无法为一个特定类关闭日志记录,也无法选择显示一个消息子集。
当运行在某些服务器中时,控制台输出也能会严重损害性能。
2、log4j可以分级别打印日志,我们都用debug级打印日志信息。
例如:
PublicclassTest{
PrivatestaticLoglog=LogFactory.getLog(Test.class);
PublicvoidgetName(StringuserID){
//从数据库取name
…………
}
Publicvoidtest(){
StringmyID=”00001”;
log.debug(myID);
if(log.isDebugEnabled()){
log.debug(getName(myID));
}
}
}
注意:
为了效率,在第二个Debug的时候我们要加上if (log.isDebugEnabled()) 的判断:
if (log.isDebugEnabled()) {
log.debug(getName(id));
}
如果这个getName效率不太高,那么如果直接写log.debug(getName());的话,虽然它不会打印语句,但是getName还是被执行了,这样就白费了功夫,所以加上isDebugEnabled就可以避免执行getName了,这个方法一般用在认为getName这个函数效率不太高的情况下。
3、在使用debug中,避免抛出NullPoint的错误。