code Review

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上),






猜你喜欢

转载自ilovejoe.iteye.com/blog/2097364