CodeReview到底干点啥?

时间:2022-05-12 01:48:40

CodeReview到底干点啥?

今天现场的Leader心血来潮,号召大家来搞codeReview。搞得那叫一个郁闷阿。
其实仔细想想自己也不是很明白,CodeReview到底要干点啥?
从网上找了点一下是引用。
 

codereview是不解决程序的编译问题的,它主要的职责是保证代码的质量。

Code Review是一种用来确认方案设计和代码实现的质量保证机制,通过这个机制我们可以对代码,测

试过程和注释进行检查。

code review的三个前提:

1).代码可以顺利运行;

2).项目测试人员已经做过单元测试;

3).其次最重要的是开发人员对代码已经基本了解

code review所做的工作:

1).完整性检查(Completeness);

2).一致性检查(Consistency);

代码的逻辑是否符合设计文档;

代码中使用的格式、符号、结构等风格是否保持一致;

3).正确性检查(Correctness)

代码是否符合制定的标准

所有的变量都被正确定义和使用

所有的注释都是准确的

所有的程序调用都使用了正确的参数个数

4).可修改性检查(Modifiability

代码涉及到的常量是否易于修改(如使用配置、定义为类常量、使用专门的常量类等)

代码中是否包含了交叉说明或数据字典,以描述程序是如何对变量和常量进行访问的

代码是否只有一个出口和一个入口(严重的异常处理除外)

5).可预测性检查(Predictability)

       代码所用的开发语言是否具有定义良好的语法和语义

       是否代码避免了依赖于开发语言缺省提供的功能

       代码是否无意中陷入了死循环

       代码是否是否避免了无穷递归

6).健壮性检查(Robustness)

       代码是否采取措施避免运行时错误(如数组边界溢出、被零除、值越界、堆栈溢出等)

7).结构性检查(Structuredness)

       程序的每个功能是否都作为一个可辩识的代码块存在

       循环是否只有一个入口

8).可追溯性检查(Traceability)

       代码是否对每个程序进行了唯一标识

       是否有一个交叉引用的框架可以用来在代码和开发文档之间相互对应

       代码是否包括一个修订历史记录,记录中对代码的修改和原因都有记录

       是否所有的安全功能都有标识

9).可理解性检查(Understandability)

      注释是否足够清晰的描述每个子程序

       是否使用到不明确或不必要的复杂代码,它们是否被清楚的注释

       使用一些统一的格式化技巧(如缩进、空白等)用来增强代码的清晰度

       是否在定义命名规则时采用了便于记忆,反映类型等方法

       每个变量都定义了合法的取值范围

       代码中的算法是否符合开发文档中描述的数学模型

10).可验证性检查(Verifiability)

代码中的实现技术是否便于测试

Code Review经验检查项

以下是在实践中建立的检查列表checklist),通过分类和有针对性的检查项保证了Code Review可以有的放矢。

1. 面向对象设计方面检查项

这几点的范围都很大,不可能在本文展开讨论,有专门的书籍介绍这方面问题,当然在Code Review中主要靠经验来判断。

A)       类设计和抽象是否合适

B)        是否符合面向接口编程的思想

C)       是否采用合适的设计范式

2 性能方面检查项

性能检查在大多数代码中都是需要严重关注的方面,也是最容易出现问题的方面,常常有程序员写出了功能和语法没有丝毫问题的代码后,正式运行时却在性能上表现不佳,从而不得不做大量的返工,甚至是推倒重来。

A)       在海量数据出现时,队列,表,文件,在传输,upload等方面是否会出现问题,有无控制,如分配的内存块大小,队列长度等控制参数

B)       hashtable,vector等集合类数据结构的选择和设置是否合适,如正确设置capacity,load factor等参数,数据结构的是否是同步的

C)       有无滥用String对象的现象

D)       是否采用通用的线程池、对象池模块等cache技术以提高性能

E)       类的接口是否定义良好,如参数类型等,避免内部转换

F)       是否采用内存或硬盘缓冲机制以提高效率

G)       并发访问时的应对策略

H)       I/O方面是否使用了合适的类或采用良好的方法以提高性能(如减少序列化,使用buffer类封装流等)

I)         同步方法的使用是否得当,是否过度使用

J)         递归方法中的叠代次数是否合适,应该保证在合理的栈空间范围内

K)       如果调用了阻塞方法,是否考虑了保证性能的措施

L)        避免过度优化,对性能要求高的代码是否使用profile工具,如Jprobe等

3 程序流程方面检查项

A)       循环结束条件是否准确

B)        是否避免了死循环的产生

C)       对循环的处理是否合适,如循环变量,局部对象,循环次数等能够考虑到性能方面的影响

数据库处理方面

很多Code Review人员在面对代码中涉及到的数据库可移植性和提高数据库性能方面的冲突时表现的无所适从,凡事很难两全其美的啊。

A)       数据库设计或SQL语句是否便于移植(注意和性能方面会存在冲突)

B)       数据库资源是否正常关闭和释放

C)       数据库访问模块是否正确封装,便于管理和提高性能

D)       是否采用合适的事务隔离级别

E)       是否采用存储过程以提高性能

F)        是否采用PreparedStatement以提高性能

5 异常处理方面检查项

JAVA中提供了方便的异常处理机制,但普遍存在的是异常被捕获,但并没有得到处理。我们可以打开一段代码,最常见的现象是进入某个方法后,一个大的try/catch将所有代码行括住,然后在catch中将异常打印到控制台,而且该异常是Exception对象。

A)       每次当方法返回时是否正确处理了异常,如最简单的处理,记录日志到日志文件中

B)        是否对数据的值和范围是否合法进行校验,包括采用断言(assertion

C)       在出错路径上是否所有的资源和内存都已经释放

D)       所有抛出的异常都得到正确的处理,特别是对子方法抛出的异常,在整个调用栈中必须能够被捕捉并处理

E)        当调用导致错误发生时,方法的调用者应该得到一个通知

F)        不要忘了对错误处理部分的代码进行测试,很多代码在正常情况下执行良好,而一旦出错,整个系统就崩溃了

方法(函数)方面检查项

A)       方法的参数是否都做了校验

B)        数组类结构是否做了边界校验

C)       变量在使用前是否做了初始化

D)       返回堆对象的reference,不要返回栈对象的reference

E)        方法API是否被良好定义,即是否尽量面向接口编程,便于维护和重构

 

 以上的算是理论了,真正的实施过程中还需要很多的变化和经验

如果只是为了完成过场,则会累人累己。

例如,人数不要太多;并且每组至少有一人有熟练编辑经验,同时具有局部模块设计能力,并且此人作为 小组组长,最好能保证一个CodeReview小组成员来自一个开发组。

实施时CodeReview总体粗分可以分为:

A、分析每人代码是否符合编程规范等

B、分析经典有缺陷代码

C、分析经典优秀代码

D、通过分析部分代码来映射反观设计要点

E、分析代码现场实施重构