网进科技JAVA编码规范Word格式.docx
《网进科技JAVA编码规范Word格式.docx》由会员分享,可在线阅读,更多相关《网进科技JAVA编码规范Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
理由:
起一个有一贯性的名字.测试代码为使用方法的样品.
其他方法:
将ClassName的综合测试类名作为ClassNameUt(Ut为UnitTest之略)
(4)测试类的位置
测试类配置在和被测试类相同目录,或者其副目录“test”中.
如果不是在物理上相近的位置的话,维护会被忘记.关于和产品代码的分离,可以用其他的工具(makefile,Ant的build.xml等)调整.
3.命名规则
(5)软件包名
用“.”隔开的文字.
march.domainname.projectname
junit.framework
建议在实际的项目中,包的命名由项目经理和开发组长来制定,在整个项目中使用统一的包名及类名。
结合本公司的实际,制定一个参考如下(都位于<
projectroot>
/src目录下):
march.domain//存放DTO,POJO,JAVABEAN
com.nemtarch.spring//存放Spring的相关文件
march.struts.actin//存放struts的ACTION类
march.struts.form//存放struts的FORM类
march.filter//存放过滤器,如session过滤器,字符过滤器等
march.listener//存放监听器,如访问流量监听器,
商业软件中的配置文件读取监听器
march.util//存放公用的类库,以后完善了我们公司的类库过后,就可以只用导入一个JAR包就可以啦
march.maps//存放iBATIS的XML配置文件
march.interface//存放接口类
march.infaimpl//存放接口实现类(这个可以根据需要,也可以用march.dao)
march.dao//实体操作类
march.abst//存放抽象类
march.hibernate//存放hibernate相关类
march.test//存放的测试类
march.service//业务接口外部调用类
mon//基本配置类
march.excel//生成EXCEL的操作类
(根据项目的不同,下面可以再添加相关的包,这个可以由PM来决定)
(6)文件名
Public类名要根据编译程序的规则,必须是和文件名相同(包含大写小写的区別).
(7)类名
开头大写.后面将隔开作为大写.
CapitalizedWithInternalWordsAlsoCapitalized
(8)异常类名
将最后作为了Exception的类名.
ClassNameEndsWithException
(9)接口名
同类名.但是,如果有和class区別的必要的话,最开始加I.
InameOfInterface
(10)实现类名
特别是有和interface区別的必要的话,最后加Impl.
ClassNameEndsWithImpl
(11)抽象类名
没有适合抽象类名的名字时,从Abstract开始,起一个联想SubClass名的名字.
AbstractBeforeSubClassName
(12)常数(staticfinal)
将大写用“_”连接的.
UPPER_CASE_WITH_UNDERSCORES
(*注:
)static和final的区别
final注意要素:
1.abstract和final不能同时修饰一个类。
2.修饰方法保证该方法不能被子类重载,已经被private修饰的方法以及所有包含在final类中的方法,都被缺省认为是fianl的。
3.如果是修饰primitive数据,那么这份数据是不可更改的,如果是修饰对象的话,那么其指向不可更改。
但例如一个对象内部有另外一个对象,这另外一个对象可以变更。
两者重点不同:
static强调只有一份
final强调是常量
(13)方法名
最开始是小写,后面隔开用大写.
firstWordLowerCaseButInternalWordsCapitalized()
(14)Factory方法(newObject的)
XnewX()
XcreateX()
(15)Converter方法(将Object变换成其他的Object的)
XtoX()
(16)属性的取得方法
当然,如果用MYECLIPSE开发的话,属性的取得方法和设定方法都是可以自动生成的
Xx()
在XgetX()//JavaBeans可以作为Proverty来用(推荐)
在booleanisEnabled()//JavaBeans可以作为Proverty(标准)来用(推荐)
(17)属性的设定方法
在voidsetX(Xvalue)//JavaBeans可以作为Proverty(标准)来用(推荐)
(18)返回boolean变量的方法
is+形容词,can+动詞,has+过去分词,三单元动词,三单元动词+名词.
在booleanisEmpty()//JavaBeans可以作为Proverty(标准)来用(推荐)
booleanempty()//不行!
因为能取’空’的动词的意思,所以不好.
booleancanGet()
booleanhasChanged()
booleancontains(Object)
booleancontainsKey(Key)
if,while文等的条件会变为容易读.还有true是哪个意思容易懂.
(19)英语和汉语
所有的标识符的名字都要以英語为基本,另外作成汉语对应用语辞典,在Project的整个生命周期维护.
(20)名字的对称性
取类名,方法名时,注意以下英語的对称性.
add/remove
insert/delete
get/set
start/stop
begin/end
send/receive
first/last
get/release
put/get
up/down
show/hide
source/target
open/close
source/destination
increment/decrement
lock/unlock
old/new
next/previous
(21)LoopCounter
范围(通用范围)较小的LoopCounter,重复中将i,j,k的名字按顺序使用.
(22)范围狭的名字
范围狭的变量名使用省略了型名的为好.
例:
ServeletContextsc=getServletContext();
(23)无意思的名字
叫做Info,Data,Temp,Str,Buf的名字要再考虑.
坏例子:
doubletemp=Math.sqrt(b*b-4*a*c);
好例子:
doubledeterminant=Math.sqrt(b*b-4*a*c);
(24)大写小写
大写和小写被作为其他的文字来用,但不能取仅用此区別的名字.
(25)其他
其他,因Project不同,有时会用以下的命名规则.
Local变量:
lower_case_with_underscore
private/protected变量:
_prefixUnderscore或suffixUnderscore_
staticprivate/protected变量:
__twoPrefixUnderscores或twoSuffixUnderscores__
4.指南
(26)编码形式
编码形式是以SunMicrosystems,Inc的JDK源程序为准.编排基本上是和K&
R的C语言形式相同,但将类及方法的定义开头的”{“不改行写.
/*COPYRIGHT...
*...文件开头有时有copywrite.这里不是/**,而是/*的注释.
*/
packagemyProject.util;
然后,package,1行空,import的罗列
importjava.util.Stack;
在importjava.util.Vector;
类定义之前从关于类的/**开始的注释.第1行短,明白说明类.用半角句号结束.从下一行开始详细说明.继续行按照第2个*,将*放在开头.
/**************************************************
*FileName:
DaoConfig.java
*Version:
1.00
*Author:
Bruce
*Date:
2006-07-27
*LastmodifyDate:
2006-07-26
*Function:
读取配置文件以获取相关的信息
*
*CopyRight(c)NetmarchCompany2006
*Allrightsreserved
**************************************************/
类定义开始的”{“不改行.
publicclassStack{定义开始的”{“不改行.
/**方法的注释也和类同样.
*追加要素.@param,@return,@exception(如有)为
*@paramitem追加的要素必须.根据需要@see等.
*/
publicvoidpush(Objectitem){方法定义开始的”{“也不改行.
if(itemCapacity<
=itemCount){
//...if,while等的关键词和“(“之间空一格.
字朝下}else(方法名后面的”(“无空格).”(“的后面不空,
1TAB=4SPACE.{运算符的两侧空格.”(“的后面空格,继续
//...“{“.
}注意用if/else的“{“,“}”的位置.
}
/**
*取得开头要素.开头要素被除去.
*@return开头要素
publicObjectpop(){
//...
returntop;
不用()包围return值.
关于缩排,{}的位置,为了不破坏各自的创造性,不敢规定.
当然在MyEclipse中开发的时候,先用“CTRL+A”全部选中过后,可以使用快捷键”CTRL+SHIFT+O”来进行自动排版
(27)长的行
一行最大80个字,超过时要分行.分割的指針是,
(1)利用Local变量,
(2)用回车键改行,(3)在优先低的运算符的前面改行.
doublelength=Math.sqrt(Math.pow(Math.random(),2.0)+
Math.pow(Math.random(),2.0));
//方针
(1)
doublexSquared=Math.pow(Math.random(),2.0);
doubleySquared=Math.pow(Math.random(),2.0);
doublelength=Math.sqrt(xSquared+ySquared);
//方针
(2)
doublelength=Math.sqrt(Math.pow(Math.random(),2.0,
Math.pow(Math.random(),2.0);
//方针(3)
returnthis==obj
||(this.objinstanceofMyClass
&
this.field==obj.field);
(28)长的声明行
类,方法的声明很长时,
(1)用extends/implements/throws节改行,
(2)用回车键改行.
publicclassLongNameClassImplemenation
extendsAbstractImplementation,
implementsSerializable,Cloneable{
privatevoidlongNameInternalIOMethod(inta,intb)
throwsIOException{
//…
publicvoidlongMethodSignature(inta,intb,intc,
intd,inte,intf){
(29)import
在import尽量不使用*.从同一个软件包import3个以上的类时,使用*.
将依存性明确化.如有使用了多个*的import,读起来辛苦.但是,重复使用某个软件包时等(会用).
(30)abstractclassvs.interface
抽象类(abstractclass)尽量不使用,而多用interface吧.abstractclass仅在有一部分安装,一部分是抽象方法时使用.
interface有多少都可以继承,但class只有1个.从1个开始继承的话,就再也不能继承了,没办法.AbstractclassmeansisA,interfacemeanslikeA;
(31)初始化
不以初始化为目的(参照没有被null初始化).还有,不2度初始化.
坏例子:
classPoorInitialization{
privatename=“initial_name”;
publicSample(){
name=“initial_name”;
//ERROR
将关于初始化的BUG最小化.
(32)避免static变量
static变量(类变量)要极力避免.(staticfinal常数除外)
(33)喜欢final吧
如果实例变量在被作成之后绝对不变化的话,积极使用final.还有,如果不变更方法的自变量的参照地的话,当作final吧.
final,synchronization、编译的効率化等容易被适用.从内部类参照自变量时,有必要是final.
(34)privatevs.protected
在对象的生命周期要锁定在一定范围时,尽量用private,使别人不能破坏封装性.
private确实能够ShutOut从类外来的使用,但客户不能凭subclass化进行细的Chaining.喜欢使用private吧.protected以后,发生了变更时继承了它的全类会产生影响
(35)get/set方法
要避免过度作成到实例变量的Access方法getX()/setX()后当做public.讨论其必要性,做成更有意思的方法.
实例变量多数依存于其他的实例变量.不能破坏类内部的整合性.
(36)变量隐藏
使用和超级类的变量名相同的变量名要避免.
一般来说这是BUG.如有意图要注释.
(37)排列声明
排列的声明为Type[]arrayName.
TypearrayName[]不过是作为从C那里剩留下的.
staticvoidmain(String[]args);
---○
staticvoidmain(Stringargs[]);
---×
当然,上面这种写法也不会错,但是建议还是养成好的编码规范吧!
(38)public方法
类的public方法以「自动销售机的接口」为目标.设计成容易懂,即使搞错了使用方法,内部的整合性也不会搞坏.还有,如果可能,进行按合同的设计(DesignbyContract),用代码表现类的不变条件和方法的事前事后条件.
(43)this的return
即使假装考虑了客户的方便,returnthis也要尽量避免.
叫做a.meth1().meth2().meth3()的连锁一般会成为synchronization上的问题之源
(44)方法的多重定义
因为自变量的类型,要尽量避免方法的OrverLoad(自变量数不同为OK).特别是和继承一起使用的话较为麻烦.
×
:
draw(Line),draw(Rectangle)
○:
drawLine(Line),drawRectangle(Rectangle)
draw(Shape)
(45)equals()和hashCode()
若重载Object.equals()方法,同时hashCode()方法也重载,相反亦然。
因为对应Container类(Hashtable)等.
clone()
如果使用clone()方法,需封装Cloneable并清楚标明。
classFooimplementsCloneable{
publicObjectclone(){
try{
Foofoo=(Foo)super.clone();
//Foo类的属性的(Clone)
}catch(CloneNotSupportedExceptione){
//因为implementsCloneable所以不能发生
thrownewInternalError();
在shallowcopy里不好的Case很多.
(47)缺省构造方法
如果可以的话,不管什么时候都准备缺省的构造方法(没有自变量的方法).
在Class.newInstance()里从类名字符串可以动态创建该类.
(48)abstractmethodinabstractclasses
在abstract类,通过添加no-op方法,并明确声明为abstact方法.并且,如果可以准备可共有的缺省封装,将其做为protected,使SubClass可在1行写处理.
因为java编译程序在编译时可检出没被封装的abstract方法,所以可以避免所谓忘记单个封装的Bug.
(49)Object的同值比较
Object的比较是使用equals()方法,不是使用==.而String的比较必须使用==.
如果封装者准备了equals(),应该是希望使用使用该方法才封装的.
equals()的缺省的封装,仅仅是==而已.
在单体测试里,因为assertEquals使用了equals(),可以简单地写同值测试.
(50)声明与初始化
Local变量与初始值一起声明.
最小化变量的假定值.
不好的例子:
voidf(intstart){
inti,j;
//无初始值声明
//多的代码
i=start+1;
j=i+1;
//使用i,j
//使用前,首先声明与初始化
inti=start+1;
intj=i+1;
//使用i,j
(51)Local变量的再利用不好
通过反复使用Local变量,声明新的变量并初始化.
有助于编译程序的最适化.
voidf(intN,intdelta){
inti;
for(i=0;
i<
N;
i++){
//使用i
i++){//还使用i
if(...){
break;
if(i!
=N){//判断是否回到最后时使用了i
i=N–delta*2;
//再利用
for(inti=0;
//使用i
//使用其他的i
found=true;
if(found){
inttotal=N–delta*2;
//有其他含义的变量
(52)if/while条件中的“=”
if,while的条件里,必须使用(代入)“=”.
大多情况下,是Bug。
只要不是boolean型,java编译程序都可以捕捉该Bug.
(53)大小比较