网进科技JAVA编码规范Word格式.docx

上传人:b****3 文档编号:16401168 上传时间:2022-11-23 格式:DOCX 页数:25 大小:31.96KB
下载 相关 举报
网进科技JAVA编码规范Word格式.docx_第1页
第1页 / 共25页
网进科技JAVA编码规范Word格式.docx_第2页
第2页 / 共25页
网进科技JAVA编码规范Word格式.docx_第3页
第3页 / 共25页
网进科技JAVA编码规范Word格式.docx_第4页
第4页 / 共25页
网进科技JAVA编码规范Word格式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

网进科技JAVA编码规范Word格式.docx

《网进科技JAVA编码规范Word格式.docx》由会员分享,可在线阅读,更多相关《网进科技JAVA编码规范Word格式.docx(25页珍藏版)》请在冰豆网上搜索。

网进科技JAVA编码规范Word格式.docx

理由:

起一个有一贯性的名字.测试代码为使用方法的样品.

其他方法:

将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)大小比较

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1