2024年-codereview(程序员必看)_第1页
2024年-codereview(程序员必看)_第2页
2024年-codereview(程序员必看)_第3页
2024年-codereview(程序员必看)_第4页
2024年-codereview(程序员必看)_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CodeReview为什么要进行CodeReview?

如何做CodeReview?如何使用工具进行CodeReview?CheckStyleFindBugsPMD使用工具进行CodeReview的局限性我们可以做得更好1为什么要CodeReview

为完成一个软件项目需要多个成员的参与,因此存在编码风格和质量上的差异。尽管在一个项目开始之初,团队内部就对编码进行了格式化上的规范,但是在实际过程中,还是搀杂了许多个人的因素,比如习惯,思维方式等等。在整体的角度上讲,差异存在越多对项目代码的可读性及维护性影响也越大。又由于一些人可能限于水平,在编码过程当中引入了较低级且显而易见的错误,比如,资源没有释放,造成泄漏。这些隐患如果不是通过CodeReview来发现和纠正,通过测试是很难发现的。随着时间的推移,积累的问题会逐渐增多,到一定程度的话就很难再去着手处理。CodeReview可以“防患于未然”,确保质量,也能提高整个开发团队的开发水平。

2如何做CodeReview统一的编程规范和设计文档规范.也会用这些作为CodeReview的检查标准

完整的技术架构和技术架构说明或事例,争取能够包含程序编写的各个方面

不定期的CodeReview会议及代码讲解

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

4使用工具进行CodeReview自动代码复查工具CheckStyleFindBugsPMD代码评审工具Jupiter(暂不讲解)5CheckStyle简介CheckStyle:主要用于检查代码规范

目前版本5.1,主站网址/

有foreclipse的插件,插件下载网址是/projects/eclipse-cs/files/Eclipse%20Checkstyle%20Plug-in/

工作原理:检查源码,对javadoc,书写格式、基本错误等进行检查.

规则定义:默认的规则是sun的编码规范.可以自定义规范.6CheckStyle检查的问题JavaDoc注释命名约定文件头Imports长度限制空格关键字对区域(emptyblock)的检查编码的检查(魔法数、switch中错误分支)等重复的代码各种量度7CheckStyle演示演示checkstyle使用查看checkstyle各个视图演示checkstyle配置详细讲解checkstyle检查内容,以sun标准为例进行讲解,详见附件附件\Checkstyle4.mht8Javadoc注释JavaDoc注释JavadocComments

/***Returnsan<code>Integer</code>object*holdingthevalue*@paramsthestringtobeparsed.*@returnan<code>Integer</code>*objectholdingthevalue*@exceptionNumberFormatExceptionifthe*stringcannotbeparsed.*/9命名约定Java中命名采用驼峰命名方式,一般首字母小写其他后面单词首字母大写,如userName。需要注意的是右边有不同类名、接口名首字母也大写如:DateUtil常量所有字母均大写,如:MAXAGE包名都小写,如com.dareway抽象类建议以Abstract开头10Importimport中避免星号"*"删除没用的import此项可以通过eclipse中ctrl+shift+o功能进行处理11长度限制FileLength文件长度默认2000行每行长度默认80个字方法长度默认150行方法的参数个数默认7个12关键字keyword关键字的出现顺序publicstaticfinalXXX是对一个常量的声明。如果使用staticpublicfinal就是错误的13编码的习惯检查

数组尾巴的逗号如果一个数组定义的右括号与最后一个元素不在同一行,就需要有一个逗号。比如:int[]a=newint[]{1,2,3,};

14编码的习惯检查

避免内联(inline)条件判断也就是三目运算符“

?:”

。有的内联条件让代码难以理解,比如:Stringb=(a==null||a.length<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"就是一个魔法数。如果这样写就好的多:

publicstaticfinalintMALE=0;

sex=MALE;

17编码的习惯检查

被更改的循环控制变量

比如,一个for循环的循环数是只应该在最后的i++中更改的,如果出现以下代码:for(inti=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语句太多,说明某个方法需要实现的功能太多,而且很难阅读。(这个时候就需要重构,建议看看《重构》的ExtractMethod和SimplifyingConditionalExpressions.两章。),不过这个需要因程序而异。21编码的习惯检查

参数被赋值

禁止对参数赋值。某个方法传递进来的参数,是不允许在该方法中改变值的。比如:publicsomeMethod(Stringpara1){…}这个方法中,就不允许出现

para1=“newvalue”;

22编码的习惯检查

详尽的变量初始化

确保某个class在被使用时都已经被初始化成默认值(对象是null,数字和字符是0,boolean变量是false.)了多个内容相同的字符串变量

确保一个文件中的同样内容的字符串不出现多次。同一行禁止声明多个变量

确保每行只声明一个变量。23编码的习惯检查

不使用this

确保代码不使用this关键字。声明的顺序根据Sun编码规范,class或interface中的顺序如下:class声明。首先是public,然后是protected,然后是packagelevel(不包括accessmodifier)最后是private.(多个class放在一个java文件中的情况)变量声明。首先是public,然后是protected然后是packagelevel(不包括accessmodifier)最后是private.构造函数方法24FindBugs简介FindBugs是一个静态分析工具,目前版本1.3.9,主要专注于检查程序错误和性能问题。主站网址

有foreclipse的插件,插件下载网址是

/downloads.html

工作原理:它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。

规则定义:默认规则列表,可以自选需检查的项目.

25FindBugs检查问题分类正确性(Correctness):这种归类下的问题在某种情况下会导致bug,比如错误的强制类型转换等。不良实践(Badpractice):这种类别下的代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode方法等。多线程正确性(Multithreadedcorrectness):关注于同步和多线程问题。性能(Performance):潜在的性能问题。安全(Security):安全相关。高危(Dodgy):FindBugs团队认为该类型下的问题代码导致bug的可能性很高。26FindBugs演示演示FindBugs使用查看FindBugs视图演示FindBugs配置详细讲解FindBugs检查内容,详见附件附件\bugDescriptions.html27FindBugs检查内容详解equals方法参数必须是object,有人会这样写publicbooleanequals(ClassXXpara)CompareTo也必须如此。重写equals方法时,也需要重写hashCode,因为大家均默认相同的对象有相同的hashCode。Random对象可以重复使用,不需要重复创建实现Clonable接口,必须重写clone方法。Clone方法中一般要调用父类的clone方法。类里面有clone方法,但没有实现clonable接口28FindBugs检查内容详解方法中不能随意丢弃或忽略异常Collection中对象需要全部清除时,应该使用clear,而不是使用removeAll方法中不能随意调用System.exit(),更不能随意调用System.runFinalizersOnExitRuntime.runFinalizersOnExit比较对象时,使用了==,而不是equals29FindBugs检查内容详解finalizer方法不能为空,为空时应该删除finalizer如果仅仅是将对象变量赋值为null,也可以删除finalizer如果仅仅调用父类的finalizer方法,也可以删除finalizer方法中必须调用父类的finalizer方法30FindBugs检查内容详解不要在父类初始化时,初始化子类,这样可能会出问题,如下

publicclassCircularClassInitialization{staticclassInnerClassSingletonextendsCircularClassInitialization{staticInnerClassSingletonsingleton=newInnerClassSingleton();}staticCircularClassInitializationfoo=InnerClassSingleton.singleton;}31FindBugs检查内容详解不要通过类的实例去访问他的静态方法或变量。不要在session中放入未实现序列化的对象返回Boolean类型的方法返回null,会报空指针异常clone方法也不允许返回nullToString方法也不允许返回null,应该返回空串如果不是异常类,不能叫XXException32FindBugs检查内容详解方法未关闭数据库(流等资源)或方法会抛出异常导致数据库不能关闭。方法中忽略的java.io.InputStream.read(),java.io.InputStream.skip(),File.delete()等方法的返回值实现了Comparator接口的对象,最好也实现Serializable接口,将对象放入TreeMap时使用不能序列化的对象不能直接放到实现Serializable接口的对象中,要标记为transient如果一个类是Serializable的,其父类必须有默认的构造器,因为反序列化时会调用,而且此类必须有serialVersionUID如果一个类是Externalizable的必须有默认的构造器33FindBugs检查内容详解如果不是非常有必要不要乱用instanceof在hasNext方法里调用nextS是一个Collection,不要调用s.contains(s),因为他不一定是true,而且可能导致错误尽量不要使用equals去比较2个Array34FindBugs检查内容详解synchronized不能加到bool,int等对应的BooleanInteger装箱变量上。也不能用到privatestaticStringLOCK=“LOCK”;上。不要显式的调用run方法,而是调用start不要在构造器里调用start方法,如果这个类有子类,线程会在子类构造完毕前启动,导致错误不要在多线程中调用Calendar、DateFormat不要在lock的代码中调用sleep35FindBugs检查内容详解不要使用newInteger(1).toString(),Integer.toString(1)不要使用newInteger(1),使用Integer.valueOf(1)不要newString(“xx”),直接赋值即可。String串不要用+频繁拼接36FindBugs检查内容详解内部类最好定义为static,可以及时释放所在的类对象尽量使用无参数的toArray方法,而不是使用泛型的方法myCollection.toArray(newFoo[myCollection.size()]),Int和double直接的算法intx=2;inty=5;//Wrong:yieldsresult0.0doublevalue1=x/y;//Right:yieldsresult0.4doublevalue2=x/(double)y;37PMD简介PMD也是一个静态分析工具,目前版本4.2.5,主站网址/

有foreclipse的插件,插件下载网址是

/eclipse

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论