版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CodeReview,为什么要进行CodeReview?如何做CodeReview?如何使用工具进行CodeReview?CheckStyleFindBugsPMD使用工具进行CodeReview的局限性我们可以做得更好,1,为什么要CodeReview,为完成一个软件项目需要多个成员的参与,因此存在编码风格和质量上的差异。尽管在一个项目开始之初,团队内部就对编码进行了格式化上的规范,但是在实际过程中,还是搀杂了许多个人的因素,比如习惯,思维方式等等。在整体的角度上讲,差异存在越多对项目代码的可读性及维护性影响也越大。又由于一些人可能限于水平,在编码过程当中引入了较低级且显而易见的错误,比如,
2、资源没有释放,造成泄漏。这些隐患如果不是通过CodeReview来发现和纠正,通过测试是很难发现的。随着时间的推移,积累的问题会逐渐增多,到一定程度的话就很难再去着手处理。CodeReview可以“防患于未然”,确保质量,也能提高整个开发团队的开发水平。,2,如何做CodeReview,统一的编程规范和设计文档规范.也会用这些作为CodeReview的检查标准完整的技术架构和技术架构说明或事例,争取能够包含程序编写的各个方面不定期的CodeReview会议及代码讲解,3,CodeReview时间安排,CodeReview的时间安排可以根据项目大小和周期长短来定,小项目(如3个月内)可以定在10
3、天内一次,大项目(6个月以上)可以在半个月内一次,次数的安排也要讲究,在项目的开始之处应该安排密一些,在项目进展到一定的程度后,周期可以更长,一个月内一次。这种安排出于以下考虑,一是项目成员对项目的认知在开始阶段比较粗浅,问题较多,因此需要及时的纠正;而当项目成员随着进展而成长后,有很多问题可以为成员自己所避免,因此安排CodeReview的次数应该减少。除了纠正错误和问题之外,CodeReview可以通过相关人员的参与,来交流一些技巧和宝贵的经验,以讲解和讨论的形式获得提高。,4,使用工具进行CodeReview,自动代码复查工具CheckStyleFindBugsPMD代码评审工具Jupi
4、ter(暂不讲解),5,CheckStyle简介,CheckStyle:主要用于检查代码规范目前版本5.1,主站网址,6,CheckStyle检查的问题,JavaDoc注释命名约定文件头Imports长度限制空格关键字对区域(emptyblock)的检查编码的检查(魔法数、switch中错误分支)等重复的代码各种量度,7,CheckStyle演示,演示checkstyle使用查看checkstyle各个视图演示checkstyle配置详细讲解checkstyle检查内容,以sun标准为例进行讲解,详见附件附件Checkstyle4.mht,8,Javadoc注释,JavaDoc注释Javado
5、cComments/*ReturnsanIntegerobject*holdingthevalue*paramsthestringtobeparsed.*returnanInteger*objectholdingthevalue*exceptionNumberFormatExceptionifthe*stringcannotbeparsed.*/,9,命名约定,Java中命名采用驼峰命名方式,一般首字母小写其他后面单词首字母大写,如userName。需要注意的是右边有不同,10,Import,import中避免星号*删除没用的import此项可以通过eclipse中ctrl+shift+o功能
6、进行处理,11,长度限制FileLength,文件长度默认2000行每行长度默认80个字方法长度默认150行方法的参数个数默认7个,12,关键字keyword,关键字的出现顺序publicstaticfinalXXX是对一个常量的声明。如果使用staticpublicfinal就是错误的,13,编码的习惯检查,数组尾巴的逗号如果一个数组定义的右括号与最后一个元素不在同一行,就需要有一个逗号。比如:inta=newint1,2,3,;,14,编码的习惯检查,避免内联(inline)条件判断也就是三目运算符“?:”。有的内联条件让代码难以理解,比如:Stringb=(a=null|a.length
7、1)?null:a.substring(1);equals和hashCode方法检查一个类是否覆写(override)了equals和hashCode方法,,15,编码的习惯检查,不合适的token很多大牛都建议在java中不要使用switch;另外,使用c+或c-,+c或-c这样的后缀也会让可读性变差。内部赋值语句如果有人这样写:Strings=Integer.toString(i=2);是不是很想扁他?,16,编码的习惯检查,魔法数也叫MagicNumber,非常让程序不可读。比如:sex=0表示的什么意思?大多数时候,就连作者本人都要皱眉头想半天,汗所以,这里的0就是一个魔法数。如果这样
8、写就好的多:publicstaticfinalintMALE=0;sex=MALE;,17,编码的习惯检查,被更改的循环控制变量比如,一个for循环的循环数是只应该在最后的i+中更改的,如果出现以下代码:for(inti=0;i1;i+)i+;/这里是极可能是程序员大意写出来的。则说明,这个循环节有90%是大意,写错了。因为其中的循环控制变量i在一个循环中+了两次。,18,编码的习惯检查,嵌套的if层次通过指定来限制if-else的嵌套的层次。所谓的“嵌套的if”,是指一个if被包含在另一个if中。下面是嵌套数是1的代码:if(true)if(true)默认为1,建议可以增加,另外还可以检查t
9、ry等的嵌套,19,编码的习惯检查,调用父类的clone检查并确认一个类的clone()方法调用了父类的clone()。父类的finalize检查并确认一个类的finalize()调用了父类的finalize()。,20,编码的习惯检查,return语句的数量限制一个方法中return语句的数量。默认是2。忽略特定的方法(默认是equals())如果return语句太多,说明某个方法需要实现的功能太多,而且很难阅读。(这个时候就需要重构,建议看看重构的ExtractMethod和SimplifyingConditionalExpressions.两章。),不过这个需要因程序而异。,21,编码的
10、习惯检查,参数被赋值禁止对参数赋值。某个方法传递进来的参数,是不允许在该方法中改变值的。比如:publicsomeMethod(Stringpara1)这个方法中,就不允许出现para1=“newvalue”;,22,编码的习惯检查,详尽的变量初始化确保某个class在被使用时都已经被初始化成默认值(对象是null,数字和字符是0,boolean变量是false.)了多个内容相同的字符串变量确保一个文件中的同样内容的字符串不出现多次。同一行禁止声明多个变量确保每行只声明一个变量。,23,编码的习惯检查,不使用this确保代码不使用this关键字。声明的顺序根据Sun编码规范,class或int
11、erface中的顺序如下:class声明。首先是public,然后是protected,然后是packagelevel(不包括accessmodifier)最后是private.(多个class放在一个java文件中的情况)变量声明。首先是public,然后是protected然后是packagelevel(不包括accessmodifier)最后是private.构造函数方法,24,FindBugs简介,FindBugs是一个静态分析工具,目前版本1.3.9,主要专注于检查程序错误和性能问题。主站网址有foreclipse的插件,插件下载网址是,25,FindBugs检查问题分类,正确性(C
12、orrectness):这种归类下的问题在某种情况下会导致bug,比如错误的强制类型转换等。不良实践(Badpractice):这种类别下的代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode方法等。多线程正确性(Multithreadedcorrectness):关注于同步和多线程问题。性能(Performance):潜在的性能问题。安全(Security):安全相关。高危(Dodgy):FindBugs团队认为该类型下的问题代码导致bug的可能性很高。,26,FindBugs演示,演示FindBugs使用查看FindBugs视图演示FindBugs配置详细
13、讲解FindBugs检查内容,详见附件附件bugDescriptions.html,27,FindBugs检查内容详解,equals方法参数必须是object,有人会这样写publicbooleanequals(ClassXXpara)CompareTo也必须如此。重写equals方法时,也需要重写hashCode,因为大家均默认相同的对象有相同的hashCode。Random对象可以重复使用,不需要重复创建实现Clonable接口,必须重写clone方法。Clone方法中一般要调用父类的clone方法。类里面有clone方法,但没有实现clonable接口,28,FindBugs检查内容详解
14、,方法中不能随意丢弃或忽略异常Collection中对象需要全部清除时,应该使用clear,而不是使用removeAll方法中不能随意调用System.exit(),更不能随意调用System.runFinalizersOnExitRuntime.runFinalizersOnExit比较对象时,使用了=,而不是equals,29,FindBugs检查内容详解,finalizer方法不能为空,为空时应该删除finalizer如果仅仅是将对象变量赋值为null,也可以删除finalizer如果仅仅调用父类的finalizer方法,也可以删除finalizer方法中必须调用父类的finalizer
15、方法,30,FindBugs检查内容详解,不要在父类初始化时,初始化子类,这样可能会出问题,如下publicclassCircularClassInitializationstaticclassInnerClassSingletonextendsCircularClassInitializationstaticInnerClassSingletonsingleton=newInnerClassSingleton();staticCircularClassInitializationfoo=InnerClassSingleton.singleton;,31,FindBugs检查内容详解,不要通过
16、类的实例去访问他的静态方法或变量。不要在session中放入未实现序列化的对象返回Boolean类型的方法返回null,会报空指针异常clone方法也不允许返回nullToString方法也不允许返回null,应该返回空串如果不是异常类,不能叫XXException,32,FindBugs检查内容详解,方法未关闭数据库(流等资源)或方法会抛出异常导致数据库不能关闭。方法中忽略的java.io.InputStream.read(),java.io.InputStream.skip(),File.delete()等方法的返回值实现了Comparator接口的对象,最好也实现Serializable
17、接口,将对象放入TreeMap时使用不能序列化的对象不能直接放到实现Serializable接口的对象中,要标记为transient如果一个类是Serializable的,其父类必须有默认的构造器,因为反序列化时会调用,而且此类必须有serialVersionUID如果一个类是Externalizable的必须有默认的构造器,33,FindBugs检查内容详解,如果不是非常有必要不要乱用instanceof在hasNext方法里调用nextS是一个Collection,不要调用s.contains(s),因为他不一定是true,而且可能导致错误尽量不要使用equals去比较2个Array,34
18、,FindBugs检查内容详解,synchronized不能加到bool,int等对应的BooleanInteger装箱变量上。也不能用到privatestaticStringLOCK=“LOCK”;上。不要显式的调用run方法,而是调用start不要在构造器里调用start方法,如果这个类有子类,线程会在子类构造完毕前启动,导致错误不要在多线程中调用Calendar、DateFormat不要在lock的代码中调用sleep,35,FindBugs检查内容详解,不要使用newInteger(1).toString(),Integer.toString(1)不要使用newInteger(1),使
19、用Integer.valueOf(1)不要newString(“xx”),直接赋值即可。String串不要用+频繁拼接,36,FindBugs检查内容详解,内部类最好定义为static,可以及时释放所在的类对象尽量使用无参数的toArray方法,而不是使用泛型的方法myCollection.toArray(newFoomyCollection.size(),Int和double直接的算法intx=2;inty=5;/Wrong:yieldsresult0.0doublevalue1=x/y;/Right:yieldsresult0.4doublevalue2=x/(double)y;,37,PMD简介,PMD也是一个静态分析工具,目前版本4.2.5,主站网址,38,PMD检查的问题
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全面调查课件2025-2026学年人教版七年级数学下册
- 无人机空气动力学课件 1.1.5 流体模型化及流体微团上的力
- 2026年《中西医结合执业医师》综合检测模拟卷带答案详解(培优A卷)
- 2026年消防设施操作员之消防设备初级技能自测题库附参考答案详解【完整版】
- 2026年口腔医学(中级)模拟卷包附参考答案详解【夺分金卷】
- 2026年监理工程师《合同管理》通关练习试题【满分必刷】附答案详解
- 2026年交管12123驾照学法减分通关练习试题及参考答案详解(基础题)
- 【低空经济】《低空经济智慧交通发展规划方案》
- 临床化疗后科学护理与康复管理
- 2026年幼儿园迎接小学
- 2026年苏教版二年级科学下册(全册)教学设计(附教材目录)
- 腾讯收购案例分析
- 污水厂运营夜班制度规定
- 2026年就业市场:挑战与机遇并存高校毕业生就业指导与策略
- 医疗广告审查标准与医美宣传红线
- 袖阀管注浆地基加固规范方案
- 2026年建筑智能化对电气节能的推动
- 精美护士礼仪培训
- T-GDSX 001-2024 装配式园林景观设计指引
- 贵州银行笔试题库及答案
- CT成像基础课件
评论
0/150
提交评论