还剩22页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Java编码规范示例:public StringgetType;public booleanisFinished;public voidsetVisibleboolean;public voidshow;public voidaddKeyListenerListener;R4属性名使用意义完整的英文描述,第一个单词的字母使用小写,剩余单词首字母大写其余字母小写的大小写混合法属性名不能与方法名相同示例private customerName;private orderNumber;private smpSession;R5常量名使用全大写的英文描述,英文单词之间用下划线分隔开,并且使用static final修饰示例public staticfinal intMAX_VALUE=1000;public staticfinal StringDEFAULT_START_DATE=2001-12-08;SI包名采用域后缀倒置的加上自定义的包名,采用小写字母,都应该以com.botech开头不包括一些特殊原因说明除特殊原因包结构都必须以com.botech开头格式com.botech.产品名.模块名称示例证据系统融合pgis包名com.botech.proof.pgis S2通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的说明清晰准确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释S3常用组件类的命名以组件名加上组件类型名结尾示例Application类型的,命名以App结尾------MainApp Frame类型的,命名以Frame结尾------TopoFrame Panel类型的,建议命名以Panel结尾-------CreateCircuitPanel Bean类型的,建议命名以Bean结尾-------DataAccessBean EJB类型的,建议命名以EJB结尾——DBProxyEJB Applet类型的,建议命名以Applet结尾-------PictureShowApplet S4如果函数名超过15个字母,可采用以去掉元音字母的方法或者以行业内约定俗成的缩写方式缩写函数名示例getCustomerlnformation改getCustomerlnfo S5准确地确定成员函数的存取控制符号:只是该类内部调用的函数使用private属性,继承类可以使用的使用protected属性,同包类可以调用的使用就认属性不加属性控制符号,对外公开的函数使用public属性示例protected voidgetUserNameo o o oooprivate voidcalculateRate{O OQ O OO}S6含有集合意义的属性命名,尽量包含其复数的意义示例customers,orderitems
3.6编码R1对于switch语句下的case语句,必须在每个case分支结束前加上break语句说明break才能真正表示该switch执行结束,不然可能会进入该case以后的分支至于语法上合法的场景“一个case后进入下一个case处理,应该在编码设计上就避免R1数据库操作、10操作等需要使用结束close的对象必须在try-catch-finally的finally中close,如果有多个10对象需要close,需要分别对每个对象的close方法进行try-catch,防止一个10对象关闭失败其他10对象都未关闭示例try{//......}catchIOException ioe{}finallytry out.close;}catch lOExceptionioe//......try{in.close;}catch lOExceptionioeR2系统非正常运行产生的异常捕获后,如果不对该异常进行处理,则应该记录日志说明此规则指通常的系统非正常运行产生的异常,不包括一些基于异常的设计若有特殊原因必须用注释加以说明示例:Try//.......}catch lOExceptionioelogger.errorioe;}【注】不只是出异常了需要打印日志,对于重要的业务,在操作前和操作后都需要记录日志:LOGGER.infoQ R3自己抛出的异常必须要填写详细的描述信息说明便于问题定位示例throw newIOExceptionWriting dataerror!Data:+data.toStringO;R4运行时异常使用RuntimeException的子类来表示,不用在可能抛出异常的方法声明上加throws子句非运行期异常是从Exception继承而来的,必须在方法声明上加throws子句说明非运行期异常是由外界运行环境决定异常抛出条件的异常,例如文件操作,可能受权限、磁盘空间大小的影响而失败,这种异常是程序本身无法避免的,需要调用者明确考虑该异常出现时该如何处理方法,因此非运行期异常必须有throws子句标出,不标出或者调用者不捕获该类型异常都会导致编译失败,从而防止程序员本身疏忽运行期异常是程序在运行过程中本身考虑不周导致的异常,例如传入错误的参数等抛出运行期异常的目的是防止异常扩散,导致定位困难因此在做异常体系设计时要根据错误的性质合理选择自定义异常的继承关系还有一种异常是Error继承而来的,这种异常由虚拟机自己维护,表示发生了致命错误,程序无法继续运行例如内存不足我们自己的程序不应该捕获这种异常,并且也不应该创建该种类型的异常R5在程序中使用异常处理还是使用错误返回码处理,根据是否有利于程序结构来确定,并且异常和错误码不应该混合使用,推荐使用异常说明一个系统或者模块应该统一规划异常类型和返回码的含义但是不能用异常来做一般流程处理的方式,不要过多地使用异常,异常的处理效率比条件分支低,而旦异常的跳转流程难以预测注意Java
5.0程序内部的错误码可以使用枚举来表示R6注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级说明防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错示例下列语句中的表达式word=high«8|low1if a|bac2if a|bcd3如果书写为high«8|low a|bac a|bcd12虽然不会出错,但语句不易理解;3造成了判断条件出错R7避免使用不易理解的数字,用有意义的标识来替代涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的静态变量或者枚举来代替示例如下的程序可读性差if state==0state=1;...//program code}应改为如下形式:private finalstatic intTRUNK_IDLE=0;private finalstatic intTRUNK_BUSY=1;private finalstatic intTRUNK_UNKNOWN=-1;if state==TRUNKJDLEstate=TRUNK_BUSY;...〃program code}注意Java
5.0下建议使用枚举来表示异常public voidfunctionthrow newRuntimeException;}R8数组声明的时候使用int[]index,而不要使用int index[]说明使用int index[]格式使程序的可读性较差,int[]index表示声明了一个int数组int[]叫做index示例如下程序可读性差public intgetlndex[]如下程序可读性好public int[]getlndex}R9不要使用System.out与System.err进行控制台打印,应该使用工具类如日志工具进行统一记录或者打印说明代码发布的时候可以统一关闭控制台打印,代码调试的时候又可以打开控制台打印,方便调试R10集合必须指定模板类型说明方便程序阅读,除去强制转换代码示例MapString,MyObject map=new HashMapString,MyObject;Rll不要写没有必要的向上强制转型说明没必要写的向上强制转型会浪费性能,增加代码阅读难度示例以卜错误Fileinputstream fis=new FilelnputStreamf;Inputstream is=InputStreamfis;SI记录异常不要保存exception.getMessage,而要记录exception.toString,一般可通过日志工具记录完整的异常堆栈信息说明NullPointException抛出时常常描述为空,这样往往看不出是出了什么错示例try catchFileNotFoundException elogger.errore.toStringO;S2一个方法不应抛出太多类型的异常说明如果程序中需要分类处理,则将异常根据分类组织成继承关系如果确实有很多异常类型首先考虑用异常描述来区别,throws/exception子句标明的异常最好不要超过三个S3异常捕获尽量不要直接catch Exceptionex,应该把异常细分处理说明可以设计更合理异常处理分支S4如果多段代码重复做同一件事情,那么在方法的划分上可能存在问题说明若此段代码各语句之间有实质性关联并且是完成同一件功能的,那么可考虑把此段代码构造成一个新的方法S5集合中的数据如果不使用了应该及时释放,尤其是可重复使用的集合说明由于集合保存了对象的引用,虚拟机的垃圾收集器就不会回收简单说来,集合就是类似于List及Map的各种容器如果插入到容器中的对象不再使用了,应尽快从容器中移除S6源程序中关系较为紧密的代码应尽可能相邻说明便于程序阅读和查找示例矩形的长与宽关系较密切,放在一起rect.length=10;rect.width=5;S7不要使用难懂的技巧性很高的语句,除非很有必要时说明高技巧语句不等于高效率的程序,实际上程序的效率关键在于设计与算法S8明确方法功能,精确(而不是近似)地实现方法设计一个函数仅完成一件功能,即使简单功能也编写方法实现说明虽然为仅用一两行就可完成的功能去编方法好象没有必要,但用方法可使功能明确化,增加程序可读性,亦可方便维护、测试S9应明确规定对接口方法参数的合法性检查应由方法的调用者负责还是由接口方法本身负责,缺省是由方法调用者负责说明对于模块间接口方法的参数的合法性检查这一问题,往往有两个极端现象,艮I」要么是调用者和被调用者对参数均不作合法性检查,结果就遗漏了合法性检查这一必要的处理过程,造成问题隐患;要么就是调用者和被调用者均对参数进行合法性检查,这种情况虽不会造成问题,但产生了冗余代码,降低了效率S10尽量使用Java
5.0新循环写法说明代码更加简洁示例ArrayListString list=new ArrayListString;list.add...forString str:listSystem.out.printlnstr;}Sil使用Java
5.0枚举来替代以前用数字与字符串的同等目的的操作
5.0+说明Java
5.0以前没有枚举,大家都用数字或者字符串做枚举同样功能的事情示例public enumEnumDemo{ERROR,INF,DEBUGIn otherfunctionEnumDemo t=EnumDemo.DEBUG;if t==EnumDemo.ERRORO}S12interface中定义的常量不要写public、static、final的修饰词,方法不要写public修饰词说明更加简洁示例public interfaceInterface!{String TT=”abcl”;void doStart;S13新起一个线程,都要使用Thread.setName•••”设置线程名说明性能测试时可对线程状态进行监控,异常时也可以知道异常发生在哪个线程中
31.
1.1V
1.
4.1代码管理规范R1提交之前一定要先从SVN进行代码更新R2每天下班前半小时必须将稳定代码提交到SVN R3提交代码必须保证没有编译错误R4保证提交的公共文件配置文件,struts等不存在版本冲突R5重要代码变更或功能,需要在提交时填写提交说明R6每天正式开发前务必进行代码更新S1尽量做到频繁更新,每次改代码之前都要进行更新S2每天都进行代码的评审,可采用交叉评审方式,这样集中评审的工作量和工作时间就会减少,并且能够降低后续开发问题的发生概率
4.2MyEclipse优化设置说明:Eclipse设置基本相同S1修改初始内存Myeclipse安装目录名称configuration.features-cleans.links一showsplash』plugins com.genuitec.inyeclipse.product,ide--readme launcher.XXMaxPerroSize V.eclipseproduct256m9eclipse.exe-vmargsi eclipse.ini T7eclipsec.exe|-血52日6何-Xmx512mL蚓epl-vlO.html-Duser.language二en』hs_err_pid
7428.lognotice.html-XX:PermSize=128M』-XX:MaxPerinSi ze=256M S2取消动画效果Windows-Preferences S3关闭拼写检查Windows-Preferences S4取消启动插件S5禁用验证功能1说明
1.1版本说明
1.
1.1V
1.0初始版本,根据2013年公司J2EE版本规范修订而来去除了JavaScript规范(该部分规划为未来单独整理)去除了代码评审相关评审表格(这部分该由项目管理流程提供);去除了项目目录规划部分的描述(该规划后续单独提供)
1.2文档阅读说明R规则,必须遵守S建议,根据实际情况而定2项目规范
2.1项目编码项目编码统一使用utf-8进行编码,包括java、jsp、js、css、properties,xml等3JAVA规范
3.1构建R1Java项目均应采用maven进行项目构建,并能实现通过命令行自动构建说明采用Maven或Gradle进行项目构建是Java项目开发工作自动化的常见选项Gradle目前普及程度不及Maven故此公司决定采用Maven作为项目构建的基础工具未来推广自动构建、持续集成、代码白动审查等工作,均依赖于项目最基础的标准化工作希望大家遵守
3.2代码架构S1如果类在当前定义文件外被使用,则需要定义为public说明:Java强制要求每个Java文件中有一个public类型的类因此,public类和Java文件具有一一对应关系这背后隐含着Java语言推荐的代码组织规则我们在编码过程中,也应尽量遵循该规则,避免非public类在当前定义文件外被使用的情况如果需要被当前定义文件外的类使用,请声明为public,以增加代码可读性
3.3排版R1程序块要采用缩进风格编写,代码缩进单位为4个空格,不使用Tab缩进说明缩进使程序更易阅读,由于开发工具及开发操作系统环境统一,所以不使用Tab缩进【注】采用Tab键和space键进行缩进是经常发生争议的地方毫无疑问Tab键缩进的便利性远超space键但是考虑到常用的代码审查工具都建议采用space而不是tab缩进因此,为了未来代码格式化和代码审查的方便,规定采用空格缩进的方式可在开发工具中设置采用4个空格键替换Tab R2左分界符如大括号{应在语句同一行,并与语句间隔一个空格,右分界符如大括号}独占一行,同时与引用它们的语句左对齐在函数体的开始、类和接口的定义、以及if for、do、while^switch、case语句中的程序或者static、synchronized等语句块中都要采用如上的缩进方式示例if abdoStart;R3每行语句字符不超过100字符,对于较长的语句、表达式或参数要分成多行书写,换行应遵循逗号后面,操作符前面的原则示例if logger.isDebugEnabled logger.debug Sessiondestroyed,call-id*+event.getSession.getCallld;}R4不允许把多个短语句写在一行中,即一行只写一条语句说明阅读代码更加清晰示例如下例子不符合规范Object o=new Object;Object b=null;R5if,for,do,while,case,switch,default等语句自占一行,且if,for,do,while,switch等语句的执行语句无论多少都要加括号Lease的执行语句中如果定义变量必须加括号{}说明阅读代码更加清晰,减少错误产生示例if abdoStart;}case x:{inti=9;【注】这里需要特别说明的是一种被称作if then的情况R6在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符如.,后不应加空格说明阅读代码更加清晰示例if a==b{objectA.doStart;}a*=2;SI类属性和类方法不要交叉放置,不同存取范围的属性或者方法也尽量不要交叉放置格式类定义{类的静态属性定义类的静态方法定义类的私有属性定义类的保护属性定义类的公有属性定义类的私有方法定义类的保护方法定义类的公有方法定义}S2修饰词按照指定顺序书写[访问权限][static][final]示例public staticfinal Stringstr=abc;S3可以使用MyEclipse或Eclipse自带的ctrl+shift+F来自动格式化编码排版,格式化后请认真检查一下说明注意如果使用搜狗输入法,请确认与其快捷健不冲突,详细参照http://blog.csdn.net/abbuggy/article/details/
70161853.4注释R1类和接口的注释放在class或者interface关键字之前,import关键字之后注释主要是功能简述类注释使用“/†‡/”注释方式说明类和接口注释要着重功能描述、作者、交付后修改记录/***〈功能简述〉*@author[作者](必须)7示例package com.huawei.iin.logwebsmap.comm;import java.util.Date;/***LogManager类集中控制对日志读写的操作*@author张三,李四,王五*/public classLogManager R2类属性(成员变量)、公有和保护方法注释写在类属性、公有和保护方法上面,注释方式为“/***/”示例/***注释内容*/private StringlogType;*注释内容*/public voidwrite()R3公有和保护方法注释内容列出方法的一句话功能简述、功能详细描述、输入参数、输出参数、返回值、异常等格式*@param[参数2][参数2说明]‡〈功能简述〉*@param[参数1][参数1说明]*@return[返回类型说明]*@exception/throws[异常类型][异常说明]*/示例*根据日志类型和时间读取日志*分配对应日志类型的LogReader,指定类型、查询时间段、条件和反复器缓冲数,*读取日志记录查询条件为null或0的表示没有限制,反复器缓冲数为0读不到日志*查询时间为左包含原则,即[startTime,endTime*@param logTypeName日志类型名在限置文件中定义的*@param startTime查询日志的开始时间*@param endTime查询日志的结束时间*@param logLevel查询日志的级别*@param userName查询该用户的日志*@param bufferNum日志反复器缓冲记录数*@return结果集,口志反复器7public staticLogiterator readStringlogType,Date startTime,Date endTime,int logLevel,String userName,int bufferNumR4对于方法内部用throw语句抛出的异常,必须在方法的注释中标明,对于所调用的其他方法所抛出的异常,选择主要的在注释中说明对于非RuntimeException,即throws子句声明会抛出的异常,必须在方法的注释中标明说明异常注释用©exception或@throws表示,在JavaDoc中两者等价,但推荐用@exception标注Runtime异常,@throws标注非Runtime异常异常的注释必须说明该异常的含义及什么条件下抛出该异常R5注释应与其描述的代码相近,对代码的注释应放在其上方,并与其上面的代码用空行隔开,注释与所描述内容进行同样的缩排说明可使程序排版整齐,并方便注释的阅读与理解示例/***注释*/public voidexample2//注释CodeBlock One//注释CodeBlock Two§public voidexample{//注释§注释CodeBlock One//注释CodeBlock TwoR6修改代码同时修改相应的注释,以保证注释与代码的一致性R7避免在注释中使用缩写,特别是不常用缩写说明在使用缩写时或之前,应对缩写进行必要的说明R8对重写父类的方法必须进行@Override声明说明可清楚说明此方法是重写父类的方法,保证重写父类的方法时不会因为单词写错而造成错误写错方法名或者参数个数,类型都会编译无法通过示例^Override public void doRequestSipServletRequestreq throwsServletException,lOException R9对于需要注释掉不使用的代码,应使用〃注释,而不是/**/注释考虑到对SCM系统SVN等的友好,注释掉的代码段,应采用〃而不是1**1,因为采用/**/注释,修改的代码行只有首位两行,中间的代码段无任何变化这样svn工具无法判断出实际所做的修改而通过〃注释的代码,必须逐行注释,在svn工具中可以很容易判断出整个被注释掉的代码段这对于依赖svn等SCM系统进行代码审查的工作来说,是很有价值的S1在代码的功能、意图层次上进行注释,提供有用、额外的信息说明注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息示例如下注释意义不大〃如果receiveFlag为真if receiveFlag而如下的注释则给出了额外有用的信息〃如果从连结收到消息if receiveFlag【注】这一条存在争议按照目前比较主流的思路代码本身应该是具有自解释能力通过使用约定俗成的设计模式、命名规范和代码格式,经验丰富的代码编写和阅读者能够顺利的读懂代码,不需要太多注释甚至可以认为,注释写的过多,说明代码的逻辑和可读性可能存在问题同时,需要注意的一点是不要将注释等同于文档注释可以简练精致甚至不写但对类、方法的描述属于文档层面,其重要性和必要性不应存在争议S2对关键变量的定义和分支语句条件分支、循环语句等编写注释说明这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达中文注释中需使用中文标点方法和类描述的第一句话尽量使用简洁明了的话概括-下功能,然后加以句号接下来的部分可以详细描述说明注释语言不统一,影响程序易读性和外观排版,出于对维护人员的考虑,建议使用中文JavaDoc工具收集简介的时候使用选取第一句话S3一些复杂的代码需要说明示例这里主要是对闰年算法的说明//I.如果能被4整除,是闰年;/々.如果能被100整除,不是闰年;IB.如果能被400整除,是闰年
3.5命名R1类名和接口使用意义完整的英文描述,每个英文单词的首字母使用大写、其余字母使用小写的大小写混合法Pascal命名法示例Orderinformation,CustomerList,LogManager,LogConfig,SmpTransaction R2方法名使用类意义完整的英文描述第一个单词的字母使用小写、剩余单词首字母大写、其余字母小写驼峰命名法示例private voidcalculateRate;publicvoidaddNewOrder;R3方法中,存取属性的方法采用setter和getter方法,动作方法采用动词和动宾结构格式get+非布尔属性名is+布尔属性名set+属性名动词动词+宾语。