codereview程序员必看幻灯片课件

上传人:大米 文档编号:569490853 上传时间:2024-07-29 格式:PPT 页数:43 大小:524KB
返回 下载 相关 举报
codereview程序员必看幻灯片课件_第1页
第1页 / 共43页
codereview程序员必看幻灯片课件_第2页
第2页 / 共43页
codereview程序员必看幻灯片课件_第3页
第3页 / 共43页
codereview程序员必看幻灯片课件_第4页
第4页 / 共43页
codereview程序员必看幻灯片课件_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《codereview程序员必看幻灯片课件》由会员分享,可在线阅读,更多相关《codereview程序员必看幻灯片课件(43页珍藏版)》请在金锄头文库上搜索。

1、Code Review?为什么要进行Code Review??如何做Code Review??如何使用工具进行Code Review??CheckStyle?FindBugs?PMD?使用工具进行Code Review的局限性?我们可以做得更好1为什么要Code Review为完成一个软件项目需要多个成员的参与,因此存在编码风格和质量上的差异。尽管在一个项目开始之初,团队内部就对编码进行了格式化上的规范,但是在实际 过程中,还是搀杂了许多个人的因素,比如习惯,思维方式等等。在整体的角度上讲,差异存在越多对项目代码的可读性及维护性影响也越大。又由于一些人可能限于水平,在编码过程当中引入了较低级且

2、显而易见的错误,比如,资源没有释放,造成泄漏。这些隐患如果不是通过Code Review来发现和纠正,通过测试是很难发现的。随着时间的推移,积累的问题会逐渐增 多,到一定程度的话就很难再去着手处理。 Code Review可以“防患于未然”,确保质量,也能提高整个开发团队的开发水平。2如何做Code Review?统一的编程规范和设计文档规范 .也会用这些作为Code Review的检查标准?完整的技术架构和技术架构说明或事例,争取能够包含程序编写的各个方面?不定期的Code Review会议及代码讲解3Code Review时间安排Code Review的时间安排可以根据项目大小和周期长短来

3、定,小项目(如3个月内)可以定在10天内一次,大项目(6个月以上)可以在半个月内一次,次数的安排也要讲究,在项目的开始之处应该安排密一些,在项目进展到一定的程度后,周期可以更长,一个月内一次。这种安排出于以下考虑,一是项目成员对项目的 认知在开始阶段比较粗浅,问题较多,因此需要及时的纠正;而当项目成员随着进展而成长后,有很多问题可以为成员自己所避免,因此安排Code Review的次数应该减少。除了纠正错误和问题之外,Code Review可以通过相关人员的参与,来交流一些技巧和宝贵的经验,以讲解和讨论的形式获得提高。4使用工具进行Code Review自动代码复查工具?CheckStyle?

4、FindBugs?PMD代码评审工具?Jupiter(暂不讲解)5CheckStyle简介?CheckStyle:主要用于检查代码规范目前版本5.1, 主站网址http:/ eclipse的插件,插件下载网址是http:/ Checkstyle Plug-in/?工作原理:检查源码,对javadoc,书写格式、基本错误等进行检查.?规则定义:默认的规则是sun的编码规范. 可以自定义规范. 6CheckStyle检查的问题?JavaDoc注释?命名约定?文件头?Imports?长度限制?空格?关键字?对区域(empty block)的检查?编码的检查(魔法数、switch中错误分支)等?重复的

5、代码?各种量度7CheckStyle演示?演示checkstyle使用?查看checkstyle各个视图?演示checkstyle配置?详细讲解checkstyle检查内容,以sun标准为例进行讲解,详见附件 附件Checkstyle4.mht8Javadoc注释?JavaDoc注释 Javadoc Comments/* *Returns an Integer object * holding the value* param s the string to be parsed. * return an Integer * object holding the value * exceptio

6、n NumberFormatException if the * string cannot be parsed. */9命名约定Java中命名采用驼峰命名方式,一般首字母小写其他后面单词首字母大写,如userName。需要注意的是右边有不同类名、接口名首字母也大写如:DateUtil常量所有字母均大写,如:MAXAGE包名都小写,如com.dareway抽象类建议以Abstract 开头10Import?import中避免星号?删除没用的import此项可以通过eclipse中 ctrl+shift+o功能进行处理11长度限制长度限制 FileLength?文件长度默认2000行?每行长度默

7、认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.leng

8、th1) ? 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 表示的什么意思?大多

9、数时候,就连作者本人都要皱眉头想半天,汗所以,这里的?就是一个魔法数。如果这样写就好的多: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 的嵌套的层次

10、。所谓的“嵌套的if”,是指一个if被包含在另一个if中。下面是嵌套数是?的代码:if(true)if(true) 默认为1,建议可以增加,另外还可以检查try等的嵌套19编码的习惯检查编码的习惯检查?调用父类的clone检查并确认一个类的 clone()方法调用了父类的clone()。?父类的finalize检查并确认一个类的 finalize()调用了父类的finalize()。20编码的习惯检查编码的习惯检查?return 语句的数量限制一个方法中return语句的数量。默认是2。忽略特定的方法(默认是equals())如果return 语句太多,说明某个方法需要实现的功能太多,而且很难

11、阅读。(这个时候就需要重构,建议看看重构的Extract Method 和 Simplifying Conditional Expressions. 两章。 ),不过这个需要因程序而异。21编码的习惯检查编码的习惯检查?参数被赋值禁止对参数赋值。某个方法传递进来的参数,是不允许在该方法中改变值的。比如:public someMethod(String para1) 这个方法中,就不允许出现para1 = “new value”;22编码的习惯检查编码的习惯检查?详尽的变量初始化确保某个class 在被使用时都已经被初始化成默认值(对象是null , 数字和字符是0 , boolean 变量是f

12、alse.)了?多个内容相同的字符串变量多个内容相同的字符串变量确保一个文件中的同样内容的字符串不出现多次。?同一行禁止声明多个变量确保每行只声明一个变量。23编码的习惯检查编码的习惯检查?不使用this确保代码不使用this关键字。?声明的顺序根据 Sun编码规范, class 或 interface 中的顺序如下:class 声明。首先是 public, 然后是protected , 然后是 package level (不包括access modifier )最后是private . (多个class放在一个java文件中的情况)变量声明。 首先是 public, 然后是protecte

13、d然后是package level (不包括access modifier )最后是private .构造函数方法24FindBugs简介?FindBugs 是一个静态分析工具,目前版本1.3.9 , 主要专注于检查程序错误和性能问题。主站网址http:/有for eclipse的插件,插件下载网址是http:/ 它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。?规则定义:默认规则列表,可以自选需检查的项目.25FindBugs检查问题分类?正确性(Correctness):这种归类下的问题在某种情况下会导致bug,比如错误的强制类型转换等。?不良实践(Bad pr

14、actice):这种类别下的代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode方法等。?多线程正确性(Multithreaded correctness):关注于同步和多线程问题。?性能(Performance):潜在的性能问题。?安全(Security):安全相关。?高危(Dodgy):FindBugs团队认为该类型下的问题代码导致bug的可能性很高。26FindBugs演示?演示FindBugs使用?查看FindBugs视图?演示FindBugs配置?详细讲解FindBugs检查内容,详见附件附件bugDescriptions.html27FindBug

15、s检查内容详解?equals方法参数必须是object,有人会这样写public boolean equals(ClassXX para)CompareTo也必须如此。?重写equals方法时,也需要重写hashCode ,因为大家均默认相同的对象有相同的hashCode。?Random对象可以重复使用,不需要重复创建?实现Clonable接口,必须重写clone方法。Clone方法中一般要调用父类的clone方法。?类里面有clone方法,但没有实现clonable接口28FindBugs检查内容详解?方法中不能随意丢弃或忽略异常?Collection中对象需要全部清除时,应该使用clear

16、,而不是使用removeAll?方法中不能随意调用 System.exit(),更不能随意调用System.runFinalizersOnExit Runtime.runFinalizersOnExit ?比较对象时,使用了 =,而不是equals29FindBugs检查内容详解?finalizer方法不能为空,为空时应该删除?finalizer如果仅仅是将对象变量赋值为null,也可以删除?finalizer如果仅仅调用父类的finalizer方法,也可以删除?finalizer方法中必须调用父类的finalizer方法30FindBugs检查内容详解?不要在父类初始化时,初始化子类,这样可

17、能会出问题,如下public class CircularClassInitialization static class InnerClassSingleton extends CircularClassInitialization static InnerClassSingleton singleton = new InnerClassSingleton(); static CircularClassInitialization foo = InnerClassSingleton.singleton; 31FindBugs检查内容详解?不要通过类的实例去访问他的静态方法或变量。?不要在se

18、ssion中放入未实现序列化的对象?返回Boolean 类型的方法返回null,会报空指针异常?clone方法也不允许返回null?ToString方法也不允许返回null,应该返回空串?如果不是异常类,不能叫 XXException32FindBugs检查内容详解?方法未关闭数据库(流等资源)或方法会抛出异常导致数据库不能关闭。?方法中忽略的java.io.InputStream.read() ,java.io.InputStream.skip() ,File.delete()等方法的返回值?实现了Comparator接口的对象,最好也实现Serializable接口,将对象放入TreeMa

19、p时使用?不能序列化的对象不能直接放到实现Serializable接口的对象中,要标记为transient?如果一个类是 Serializable的,其父类必须有默认的构造器,因为反序列化时会调用,而且此类必须有serialVersionUID ?如果一个类是Externalizable 的必须有默认的构造器33FindBugs检查内容详解?如果不是非常有必要不要乱用instanceof?在hasNext方法里调用next?S是一个Collection,不要调用s.contains(s) ,因为他不一定是true,而且可能导致错误?尽量不要使用equals去比较2个Array34FindBug

20、s检查内容详解?synchronized 不能加到bool,int等对应的Boolean Integer装箱变量上。也不能用到private static String LOCK = “LOCK”; 上。?不要显式的调用run方法,而是调用start?不要在构造器里调用 start方法,如果这个类有子类,线程会在子类构造完毕前启动,导致错误?不要在多线程中调用 Calendar 、DateFormat ?不要在lock的代码中调用sleep35FindBugs检查内容详解?不要使用new Integer(1).toString(),Integer.toString(1) ?不要使用new In

21、teger(1),使用Integer.valueOf (1) ?不要new String(“xx”),直接赋值即可。?String串不要用+频繁拼接36FindBugs检查内容详解?内部类最好定义为static,可以及时释放所在的类对象?尽量使用无参数的toArray方法,而不是使用泛型的方法myCollection.toArray(new FoomyCollection.size() ,?Int 和double直接的算法int x = 2;int y = 5;/ Wrong: yields result 0.0double value1 = x / y;/ Right: yields res

22、ult 0.4double value2 = x / (double) y;37PMD简介?PMD也是一个静态分析工具,目前版本4.2.5 , 主站网址http:/ eclipse的插件,插件下载网址是http:/ ?工作原理: PMD通过静态分析获知代码错误。也就是说,在不运行Java程序的情况下报告错误 。?规则定义:默认规则列表,可以自选需检查的项目,也可以自定义规则. 38PMD检查的问题?潜在的bug:空的try/catch/finally/switch语句?未使用的代码:未使用的局部变量、参数、私有方法等?可选的代码:String/StringBuffer的滥用?复杂的表达式:不必

23、须的if语句、可以使用while循环完成的for循环?重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs?循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象?资源关闭:Connect,Result,Statement等使用之后确保关闭掉39PMD演示?演示PMD使用?查看PMD视图?演示PMD配置?详细讲解PMD检查内容,详见附件附件Eclipse+PMD插件分析代码规则(中文).xls40使用工具Code Review的局限?使用Code Review工具可以代替那些费时费力却有规则可循的代码检查工作,用以提高工作效率。但是他们并不能对业务逻辑进行检查,所以人工代码复查仍然是必不可少的。41我们可以做得更好今天只是讲了几个code review的工具,其实不只有这些,请看看下面:构建工具 ant、maven版本控制工具cvs、subversion项目(问题)管理工具trac、bugzilla、redmine单元测试工具junit、TestNg、Cobertura集成、负载、性能测试工具strutsTestCase、DbUnit、 JunitPerf、Jmeter等持续集成工具 continuum、hudson等等42Thank you!End.43

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号