code Review

[size=x-large][b]1、为什么要Code Review[/b][/size]

[size=large] 1、一般情况下一个软件项目是需要多个开发人参与一同完成,因此会存在编码风格和质量的差异。差异越多就越容易影响代码的可读性及维护性。代码维护性越多,后期成本会成倍增长。
2、由于一些人可能限于水平,在编码过程中引入了较低级且显而易见的错误,比如:资源没有释放,造成内存泄漏。而这些问题只有在Code Review中才能发现和纠正,通过测试是很难发现的。
3、提高整个开发团队的开发水平[/size]

[b][size=x-large]2、从哪些方面Code Review[/size][/b]

[size=large]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的异常)
[/size]
[b][size=x-large]3、FindBugs简介[/size][/b]

[size=large] 这是一款静态分析工具,主要用于检查程度错误和性能问题。

工作原理:它检查类或者jar文件,将字节码(字节码文件即.class文件)与一组缺陷模式进行对比以发现可能的问题[/size]

[b][size=x-large]4、FindBugs能检查的问题类型[/size][/b]

[size=large]1、正确性(Correntness):这种类型的问题在某种情况下会导致bug,如强制类型转换等异常。


2、不良实践(Bad practice):这种类型下的代码违反了公认的最佳实践标准,比如某个类实现了equals方法但未实现hashCode()方法等.

3、多线程正确性(MultiThread correntness):关注于同步和多线程问题。


4、性能(performance):潜在的性能问题

5、安全(Security):安全问题

6、高危(Dodgy):FindBugs团队认为该类型的问题导致bug的可能性很高[/size]

[i][b][i][size=x-large]5、FindBugs可以具体检查哪些[/size][/i][/b][/i]

[size=large] 1、在一个类中的equals方法参数必须是Object,有人会这样写public boolean equals(ClassXX para)。comparaTo()也必须是Object.

2、Random这个类下的实例可以重复使用,不需要重复创建

3、实现Clonable接口,必须重写clone方法,但clone方法中必须要调用父类的clone

4、重写equals方法时也必须重写hashCode(),因为大家均默认相同的对象也有相同的hashCode.

5、方法中不能随意丢弃或忽略异常
[/size]
[size=large]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上),

[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值