资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Code Review,为什么要进行,Code Review,?,如何做,Code Review,?,如何使用工具进行,Code Review,?,CheckStyle,FindBugs,PMD,使用工具进行,Code Review,的局限性,我们可以做得更好,1,为什么要,Code Review,为完成一个软件项目需要多个成员的参与,因此存在编码风格和质量上的差异。尽管在一个项目开始之初,团队内部就对编码进行了格式化上的,规范,,但是在实际 过程中,还是搀杂了许多个人的因素,比如习惯,思维方式等等。在整体的角度上讲,差异存在越多对项目代码的,可读性及维护性,影响也越大。又由于一些人可能限于水平,在编码过程当中引入了较低级且显而易见的错误,比如,资源没有释放,造成泄漏。这些隐患如果不是通过,Code Review,来发现和纠正,通过测试是很难发现的。随着时间的推移,积累的问题会逐渐增 多,到一定程度的话就很难再去着手处理。,Code Review,可以,“,防患于未然,”,,确保,质量,,也能,提高整个开发团队的开发水平,。,2,如何做,Code Review,统一的编程规范和设计文档规范,.,也会用这些作为,Code Review,的检查标准,完整的技术架构和技术架构说明或事例,争取能够包含程序编写的各个方面,不定期的,Code Review,会议及代码讲解,3,Code Review,时间安排,Code Review,的时间安排可以根据项目大小和周期长短来定,小项目(如,3,个月内)可以定在,10,天内一次,大项目(,6,个月以上)可以在半个月内一次,次数的 安排也要讲究,在项目的开始之处应该安排密一些,在项目进展到一定的程度后,周期可以更长,一个月内一次。这种安排出于以下考虑,一是项目成员对项目的 认知在开始阶段比较粗浅,问题较多,因此需要及时的纠正;而当项目成员随着进展而成长后,有很多问题可以为成员自己所避免,因此安排,Code Review,的次数应该减少。除了纠正错误和问题之外,,Code Review,可以通过相关人员的参与,来交流一些技巧和宝贵的经验,以讲解和讨论的形式获得提高。,4,使用工具进行,Code Review,自动代码复查工具,CheckStyle,FindBugs,PMD,代码评审工具,Jupiter,(暂不讲解),5,CheckStyle,简介,CheckStyle:,主要用于检查代码规范目前版本,5.1,主站网址,eclipse,的插件,插件下载网址是,block),的检查,编码的检查(魔法数、,switch,中错误分支)等,重复的代码,各种量度,7,CheckStyle,演示,演示,checkstyle,使用,查看,checkstyle,各个视图,演示,checkstyle,配置,详细讲解,checkstyle,检查内容,以,sun,标准为例进行讲解,详见附件,附件,Checkstyle4.mht,8,Javadoc,注释,JavaDoc,注释,Javadoc Comments,/*,*Returns an Integer object,*holding the value,*param s the string to be parsed.,*return an Integer,*object holding the value,*exception NumberFormatException if the,*string cannot be parsed.,*/,9,命名约定,Java,中命名采用驼峰命名方式,一般首字母小写其他后面单词首字母大写,如,userName,。,需要注意的是右边有不同,类名、接口名,首字母也大写如:,DateUtil,常量,所有字母均大写,如:,MAXAGE,包名,都小写,如,com.dareway,抽象类,建议以,Abstract,开头,10,Import,import,中避免星号,*,删除没用的,import,此项可以通过,eclipse,中,ctrl+shift+o,功能进行处理,11,长度限制,FileLength,文件长度 默认,2000,行,每行长度 默认,80,个字,方法长度 默认,150,行,方法的参数个数 默认,7,个,12,关键字,key word,关键字的出现顺序,public static final XXX,是对一个常量的声明。如果使用,static public final,就是错误的,13,编码的习惯检查,数组尾巴的逗号,如果一个数组定义的右括号 与最后一个元素不在同一行,就需要有一个逗号。比如:,int a=new int,1,2,3,;,14,编码的习惯检查,避免内联,(inline),条件判断,也就是三目运算符,“,?:,”,。有的内联条件让代码难以理解,比如:,String b=(a=null|a.length1)?null:a.substring(1);,equals,和,hashCode,方法,检查一个类是否覆写,(override),了,equals,和,hashCode,方法,,15,编码的习惯检查,不合适的,token,很多大牛都建议在,java,中不要使用,switch,;另外,使用,c+,或,c-,,,+c,或,-c,这样的后缀也会让可读性变差。,内部赋值语句,如果有人这样写:,String s=Integer.toString(i=2);,是不是很想扁他?,16,编码的习惯检查,魔法数,也叫 MagicNumber,非常让程序不可读。比如:,sex=0,表示的什么意思?大多数时候,就连作者本人都要皱眉头想半天,汗,所以,这里的0 就是一个魔法数。如果这样写就好的多:,public static final int MALE=0;,sex=MALE;,17,编码的习惯检查,被更改的循环控制变量,比如,一个for循环的 循环数是只应该在 最后的 i+中更改的,如果出现以下代码:,for(int i=0;i 1;i+),i+;/这里是极可能是程序员大意写出,来的。,则说明,这个循环节有90%是大意,写错了。因为其中的循环控制变量 i 在一个循环中+了两次。,18,编码的习惯检查,嵌套的if 层次,通过指定来限制 if-else 的嵌套的层次。所谓的,“,嵌套的if,”,,是指一个if被包含在另一个if中。下面是嵌套数是1的代码:,if(true),if(true),默认为,1,,建议可以增加,另外还可以检查,try,等的嵌套,19,编码的习惯检查,调用父类的clone,检查并确认一个类的clone()方法调用了父类的clone()。,父类的finalize,检查并确认一个类的finalize()调用了父类的finalize()。,20,编码的习惯检查,return 语句的数量,限制一个方法中return语句的数量。默认是2。忽略特定的方法(默认是equals()),如果return 语句太多,说明某个方法需要实现的功能太多,而且很难阅读。,(这个时候就需要重构,建议看看重构的Extract Method 和 Simplifying Conditional Expressions.两章。),,不过这个需要因程序而异。,21,编码的习惯检查,参数被赋值,禁止对参数赋值。某个方法传递进来的参数,是不允许在该方法中改变值的。比如:,public someMethod(String para1),这个方法中,就不允许出现,para1=,“,new value,”,;,22,编码的习惯检查,详尽的变量初始化,确保某个class 在被使用时都已经被初始化成默认值(对象是null,数字和字符是0,boolean 变量是false.)了,多个内容相同的字符串变量,确保一个文件中的同样内容的字符串不出现多次。,同一行禁止声明多个变量,确保每行只声明一个变量。,23,编码的习惯检查,不使用this,确保代码不使用this关键字。,声明的顺序,根据 Sun编码规范,class 或 interface 中的顺序如下:,class 声明。首先是 public,然后是protected,然后是 package level(不包括access modifier)最后是private.(多个class放在一个java文件中的情况),变量声明。首先是 public,然后是protected然后是 package level(不包括access modifier)最后是private.,构造函数,方法,24,FindBugs,简介,FindBugs,是一个静态分析工具,目前版本,1.3.9,主要专注于检查程序错误和性能问题。主站网址,有,for eclipse,的插件,插件下载网址是,practice,):这种类别下的代码违反了公认的最佳实践标准,比如某个类实现了,equals,方法但未实现,hashCode,方法等。,多线程正确性(,Multithreaded correctness,):关注于同步和多线程问题。,性能(,Performance,):潜在的性能问题。,安全(,Security,):安全相关。,高危(,Dodgy,):,FindBugs,团队认为该类型下的问题代码导致,bug,的可能性很高。,26,FindBugs,演示,演示,FindBugs,使用,查看,FindBugs,视图,演示,FindBugs,配置,详细讲解,FindBugs,检查内容,详见附件,附件,bugDescriptions.html,27,FindBugs,检查内容详解,equals,方法参数必须是,object,,有人会这样写,public boolean equals(ClassXX para),CompareTo,也必须如此。,重写,equals,方法时,也需要重写,hashCode,,因为大家均默认相同的对象有相同的,hashCode,。,Random,对象可以重复使用,不需要重复创建,实现,Clonable,接口,必须重写,clone,方法。,Clone,方法中一般要调用父类的,clone,方法。,类里面有,clone,方法,但没有实现,clonable,接口,28,FindBugs,检查内容详解,方法中不能随意丢弃或忽略异常,Collection,中对象需要全部清除时,应该使用,clear,,而不是使用,removeAll,方法中不能随意调用,System.exit(),更不能随意调用,System.runFinalizersOnExit Runtime.runFinalizersOnExit,比较对象时,使用了,=,,而不是,equals,29,FindBugs,检查内容详解,finalizer,方法不能为空,为空时应该删除,finalizer,如果仅仅是将对象变量赋值为,null,,也可以删除,finalizer,如果仅仅调用父类的,finalizer,方法,也可以删除,finalizer,方法中必须调用父类的,finalizer,方法,30,FindBugs,检查内容详解,不要在父类初始化时,初始化子类,这样可能会出问题,如下,public class CircularClassInitialization,static class InnerClassSingleton extends CircularClassInitialization,static InnerClassSingleton singleton=new InnerClassSingleton();,static CircularClassInitialization foo=InnerClassSingleton.singleton;,31,FindBugs,检查内容详解,不要通过类的实例去访问他的静态方法或变量。,不要在,session,中放入未实现序列化的对象,返回,Boolean,类型的方法返回,null,,会报空指针异常,clone,方法也不允许返回,null,ToString,方法也不允许返回,null,,应该返回空串,如果不是异常类,不能叫,XXException,32,FindBugs,检查内容详解,方法未关闭数据库(流等资源)或方法会抛出异常导致数据库不能关闭。,方法中忽略的,java.io.InputStream.read(),,,java.io.InputStream.skip(),,,File.delete(),等方法的返回值,实现了,Comparator,接口的对象,最好也实现,Serializable,接口,将对象放入,TreeMap,时使用,不能序列化的对象不能直接放到实现,Serializable,接口的对象中,要标记为,transient,如果一个类是,Serializable,的,其父类必须有默认的构造器,因为反序列化时会调用,而且此类必须有,serialVersionUID,如果一个类是,Externalizable,的必须有默认的构造器,33,FindBugs,检查内容详解,如果不是非常有必要不要乱用,instanceof,在,hasNext,方法里调用,next,S,是一个,Collection,,不要调用,s.contains(s),,因为他不一定是,true,,而且可能导致错误,尽量不要使用,equals,去比较,2,个,Array,34,FindBugs,检查内容详解,synchronized,不能加到,bool,,,int,等对应的,Boolean Integer,装箱变量上。也不能用到,private static String LOCK=,“,LOCK,”,;,上。,不要显式的调用,run,方法,而是调用,start,不要在构造器里调用,start,方法,如果这个类有子类,线程会在子类构造完毕前启动,导致错误,不要在多线程中调用,Calendar,、,DateFormat,不要在,lock,的代码中调用,sleep,35,FindBugs,检查内容详解,不要使用,new Integer(1).toString(),,,Integer.toString(1),不要使用,new Integer(1),,使用,Integer.valueOf(1),不要,new String,(,“,xx,”,),直接赋值即可。,String,串不要用,+,频繁拼接,36,FindBugs,检查内容详解,内部类最好定义为,static,,可以及时释放所在的类对象,尽量使用无参数的,toArray,方法,而不是使用泛型的方法,myCollection.toArray(new FoomyCollection.size(),Int,和,double,直接的算法,int x=2;,int y=5;,/Wrong:yields result 0.0,double value1=x/y;,/Right:yields result 0.4,double value2=x/(double)y;,37,PMD,简介,PMD,也是一个静态分析工具,目前版本,4.2.5,主站网址,eclipse,的插件,插件下载网址是,PMD,通过静态分析获知代码错误。也就是说,在不运行,Java,程序的情况下报告错误。,规则定义,:,默认规则列表,可以自选需检查的项目,也可以自定义规则,.,38,PMD,检查的问题,潜在的,bug,:空的,try/catch/finally/switch,语句,未使用的代码:未使用的局部变量、参数、私有方法等,可选的代码:,String/StringBuffer,的滥用,复杂的表达式:不必须的,if,语句、可以使用,while,循环完成的,for,循环,重复的代码:拷贝,/,粘贴代码意味着拷贝,/,粘贴,bugs,循环体创建新对象:尽量不要再,for,或,while,循环体内实例化一个新对象,资源关闭:,Connect,,,Result,,,Statement,等使用之后确保关闭掉,39,PMD,演示,演示,PMD,使用,查看,PMD,视图,演示,PMD,配置,详细讲解,PMD,检查内容,详见附件,附件,Eclipse+PMD,插件分析代码规则(中文),.xls,40,使用工具,Code Review,的局限,使用,Code Review,工具可以代替那些费时费力却有规则可循的代码检查工作,用以提高工作效率。但是他们并不能对业务逻辑进行检查,所以人工代码复查仍然是必不可少的。,41,我们可以做得更好,今天只是讲了几个,code review,的工具,其实不只有这些,请看看下面:,构建工具,ant,、,maven,版本控制工具,cvs,、,subversion,项目(问题)管理工具,trac,、,bugzilla,、,redmine,单元测试工具,junit,、,TestNg,、,Cobertura,集成、负载、性能测试工具,strutsTestCase,、,DbUnit,、,JunitPerf,、,Jmeter,等,持续集成工具,continuum,、,hudson,等等,42,Thank you,!,End.,43,
展开阅读全文