1、为什么要Code Review
1、一般情况下一个软件项目是需要多个开发人参与一同完成,因此会存在编码风格和质量的差异。差异越多就越容易影响代码的可读性及维护性。代码维护性越多,后期成本会成倍增长。
2、由于一些人可能限于水平,在编码过程中引入了较低级且显而易见的错误,比如:资源没有释放,造成内存泄漏。而这些问题只有在Code Review中才能发现和纠正,通过测试是很难发现的。
3、提高整个开发团队的开发水平
2、从哪些方面Code Review
1、开发的代码是否符合编程规范和设计文档规范
2、注释是否符合规范
3、Java中命名方法是否正确(方法名,变量名采取驼峰命名方式,一般首字母小写,其他后面单词首字母大写;类名接口名采取首字母大写;常量采取全部大写;包名采取全部小写)
4、import中避免星号“*”,删除没用的import。可通过ctrl+shift+o能自动处理
5、长度限制(文件长度默认2000行;每行长度:80;方法长度:150;方法的参数:7)
6、关键字出现的顺序,如:public static final XXX
7、避免三目运行符
8、一个Class中是否oveeride 了equals和hashCode方法
9、建议在java中不要使用switch,C++/C--/++C/--C
10、不可读数据:
如:sex=0,这表示什么,大多数情况下,就连作者本人都要皱眉头想半天,所以这里的"0"是魔法法。如果这样写就好的多:
public static final int MALE=0;
sex = MALE;
11、循环体中是否出现更改循环体变量,如:
for(int i = 0; i < 1; i++){
i++;
}
12、嵌套的if层次
通过指定来限制if-else的嵌套层次,即一个if中包含另一个if。如:
if(true){
if(true){
}
}默认为1,建议可以增加,另外还可以检查try等嵌套
13、检查并确认一个类中clone()方法与finalize()都调用了父类的clone()与finalize().
14、限制一个方法中return语句的数据(默认是2条),如果return语句太多,说明某个方法实现的功能过多,而且很难阅读。
15、在一个方法中,禁止对传来的参数进行赋值,如:
public someMethod(String para1){
para1 = "new para1"; //这是禁止的
}
16、确保某个class在被使用时都已经被初始化成默认值(对象是null; 数据和字符是0;boolean变量是false)
17、确保在一个.java文件中,同样内容的字符串不可出现多次。如String name String mz
18、同一行中禁止声明多个变量,即每行只能声明一个变量
19、不使用this(容易造成badTokenException的异常)
3、FindBugs简介
这是一款静态分析工具,主要用于检查程度错误和性能问题。
工作原理:它检查类或者jar文件,将字节码(字节码文件即.class文件)与一组缺陷模式进行对比以发现可能的问题
4、FindBugs能检查的问题类型
1、正确性(Correntness):这种类型的问题在某种情况下会导致bug,如强制类型转换等异常。
2、不良实践(Bad practice):这种类型下的代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode()方法等.
3、多线程正确性(MultiThread correntness):关注于同步和多线程问题。
4、性能(performance):潜在的性能问题
5、安全(Security):安全问题
6、高危(Dodgy):FindBugs团队认为该类型的问题导致bug的可能性很高
[i]5、FindBugs可以具体检查哪些[/i]
1、在一个类中的equals方法参数必须是Object,有人会这样写public boolean equals(ClassXX para)。comparaTo()也必须是Object.
2、Random这个类下的实例可以重复使用,不需要重复创建
3、实现Clonable接口,必须重写clone方法,但clone方法中必须要调用父类的clone
4、重写equals方法时也必须重写hashCode(),因为大家均默认相同的对象也有相同的hashCode.
5、方法中不能随意丢弃或忽略异常
6、Collection中对象需要全部清除时,应该调用clear(),而不是removeAll()
7、方法中不能随意调用System.exit()(用于结束掉当前正在运行的java虚拟机,即终止所有正在运行的程序),更不能随便调用System.runFinalizerOnExit(当程序结果的时候执行垃圾回收)
8、比较对像时应使用equals而不是==
9、finalizer()方法不能为空(对没有被引用的对像进行回收释放内存资源)为空时应该删除
10、finalizer()方法中的参数为null时,也可删除此方法
11、finalizer()方法中如果仅仅调用父类的方法,也可以删除
12、finalizer()方法中必须调用父类的finalizer()方法
13、不要通过类的实例去访问它的静态方法或变量
14、不要在session中放入未实现序列化的对像
15、返回Boolean 类型的方法返回null,会报空指针异常
16、clone方法也不允许返回null
17、toString() 也不允许返回null,应该返回空字符串。
18、如果不是异常类,类的名称不能命名为XXException
19、方法未关闭数据库(流等资源)或方法会抛出异常导致数据库不能关闭(如果不关流,长时间的话会出OutOfMemoryError异常;如果Connection没有关闭的话,连接就会一直被占用,当被占用的连接数达到tomcat设置的最大数时,就会导致系统连不上数据库了,而且一样会占用资源)
20、方法中忽略的java.io.InputStream.read(),java.io.InputStream.skip(),File.delete()等方法的返回值
21、实现了Comparator接口的对象,最好也实现Serializable接口,将对象放入Treemap时使用
22、不能序列化的对象不能直接放到实现Serializable接口的对象中,要标记为transient
23、如果一个类是Serializable的,其父类必须有默认的构造器,因为反序列化时会调用,而且此类必须有serialVersionUID
24、如果一个类是Externalizable的必须有默认构造器。
25、如果不是非常有必要不要乱用instanceof
26、在hasNext方法里调用next
27、synchronized不能加在Integer,Boolean等装箱变量上(因为在运算过程中,java是自动解箱,再装箱成新对象的,这一过程导致对像改变,无法用在synchronized上),
code Review
猜你喜欢
转载自ilovejoe.iteye.com/blog/2097364
今日推荐
周排行