`

代码评审介绍(3)

阅读更多

什么是Code Review

 

 

Code Review 是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节。

本文通过对Code Review的一些概念和经验的探讨,就如何进行Code Review和Code Review中应该注意什么提出一些建议。

本文中涉及的问题大部分针对JAVA类代码。同时本文不涉及Code Review过程和组织。

关键词: Code Review   JAVA    代码质量   软件工程

一、Code Review简介

1 Code Review的目的

凡事知其然还要知其所以然,我们首先需要知道什么是Code Review和我们使用它的目的是什么。

Code Review是一种用来确认方案设计和代码实现的质量保证机制,通过这个机制我们可以对代码、测试过程和注释进行检查。

Code Review主要用来在软件工程过程中改进代码质量,通过Code Review可以达到如下目的:

  • 在项目早期就能够发现代码中的BUG
  • 帮助初级开发人员学习高级开发人员的经验,达到知识共享
  • 避免开发人员犯一些很常见,很普通的错误
  • 保证项目组人员的良好沟通
  • 项目或产品的代码更容易维护

2 Code Review的前提

知道了Code Review的目的,我们就可以看看如何做Code Review了,但在做Code Review前我们还有事要做,所谓预则立,不预则废,就是说如果在进入Code Review之前我们不做些准备工作,Code Review很容易就变得没有意义或是流于形式,这在我们周围是有很多例子的啊。进入Code Review需要检查的条件如下:

  1. Code Review人员是否理解了Code Review的概念和Code Review将做什么
  2. 如果做Code Review的人员不能理解Code Review对项目成败和代码质量的重要程度,他们的做法可能就会是应付了事。
  3. 代码是否已经正确的build,build的目的使得代码已经不存在基本语法错误
  4. 我们总不希望高级开发人员或是主管将时间浪费在检查连编译都通不过的代码上吧。
  5. 代码执行时功能是否正确
  6. Code Review人员也不负责检查代码的功能是否正确,也就是说,需要复查的代码必须由开发人员或质量人员负责该代码的功能的正确性。
  7. Review人员是否理解了代码
  8. 做复查的人员需要对该代码有一个基本的了解,其功能是什么,是拿一方面的代码,涉及到数据库或是通讯,这样才能采取针对性的检查
  9. 开发人员是否对代码做了单元测试

这一点也是为了保证Code Review前一些语法和功能问题已经得到解决,Code Review人员可以将精力集中在代码的质量上。

3 Code Review需要做什么

好了,进入条件准备好了,有人在这些条件中看到Code Review这也不负责,那也不检查,不禁会问,Code Review到底做什么?

其实Code Review主要检查代码中是否存在以下方面问题:代码的一致性、编码风格、代码的安全问题、代码冗余、是否正确设计以满足需求(性能、功能)等等

下边我们一一道来。以下内容参考了《Software Quality Assurance: Documentation and Reviews》一文中的代码检查部分。

3.1 完整性检查(Completeness)

  • 代码是否完全实现了设计文档中提出的功能需求
  • 代码是否已按照设计文档进行了集成和Debug
  • 代码是否已创建了需要的数据库,包括正确的初始化数据
  • 代码中是否存在任何没有定义或没有引用到的变量、常数或数据类型

3.2 一致性检查(Consistency)

  • 代码的逻辑是否符合设计文档
  • 代码中使用的格式、符号、结构等风格是否保持一致

3.3 正确性检查(Correctness)

  • 代码是否符合制定的标准
  • 所有的变量都被正确定义和使用
  • 所有的注释都是准确的
  • 所有的程序调用都使用了正确的参数个数

3.4 可修改性检查(Modifiability)

  • 代码涉及到的常量是否易于修改(如使用配置、定义为类常量、使用专门的常量类等)
  • 代码中是否包含了交叉说明或数据字典,以描述程序是如何对变量和常量进行访问的
  • 代码是否只有一个出口和一个入口(严重的异常处理除外)

3.5 可预测性检查(Predictability)

  • 代码所用的开发语言是否具有定义良好的语法和语义
  • 是否代码避免了依赖于开发语言缺省提供的功能
  • 代码是否无意中陷入了死循环
  • 代码是否是否避免了无穷递归

3.6 健壮性检查(Robustness)

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

3.7 结构性检查(Structuredness)

  • 程序的每个功能是否都作为一个可辩识的代码块存在
  • 循环是否只有一个入口

3.8 可追溯性检查(Traceability)

  • 代码是否对每个程序进行了唯一标识
  • 是否有一个交叉引用的框架可以用来在代码和开发文档之间相互对应
  • 代码是否包括一个修订历史记录,记录中对代码的修改和原因都有记录
  • 是否所有的安全功能都有标识

3.9 可理解性检查(Understandability)

  • 注释是否足够清晰的描述每个子程序
  • 是否使用到不明确或不必要的复杂代码,它们是否被清楚的注释
  • 使用一些统一的格式化技巧(如缩进、空白等)用来增强代码的清晰度
  • 是否在定义命名规则时采用了便于记忆,反映类型等方法
  • 每个变量都定义了合法的取值范围
  • 代码中的算法是否符合开发文档中描述的数学模型

3.10 可验证性检查(Verifiability)

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

二、Code Review经验检查项

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

1 JAVA编码规范方面检查项

2 面向对象设计方面检查项

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

  1. 类设计和抽象是否合适
  2. 是否符合面向接口编程的思想
  3. 是否采用合适的设计范式

3 性能方面检查项性能检查

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

  1. 在海量数据出现时,队列、表、文件,在传输、upload等方面是否会出现问题,有无控制,如分配的内存块大小、队列长度等控制参数
  2. 对hashtable,vector等集合类数据结构的选择和设置是否合适,如正确设置capacity、load factor等参数,数据结构的是否是同步的
  3. 有无滥用String对象的现象
  4. 是否采用通用的线程池、对象池模块等cache技术以提高性能
  5. 类的接口是否定义良好,如参数类型等、避免内部转换
  6. 是否采用内存或硬盘缓冲机制以提高效率
  7. 并发访问时的应对策略
  8. I/O方面是否使用了合适的类或采用良好的方法以提高性能(如减少序列化、使用buffer类封装流等)
  9. 同步方法的使用是否得当,是否过度使用
  10. 递归方法中的叠代次数是否合适,应该保证在合理的栈空间范围内
  11. 如果调用了阻塞方法,是否考虑了保证性能的措施
  12. 避免过度优化,对性能要求高的代码是否使用profile工具,如Jprobe等

4 资源泄漏处理方面检查项

对于JAVA来说由于存在垃圾收集机制,所以内存泄漏不是太明显,但使用不当,仍然存在内存泄漏的问题。而对于其它的语言,如C++等在这方面就要严重关注了。当然数据库连接资源不释放的问题也是广大程序员最常见的,相信有很多的PM被这个问题折磨的死去活来。

  1. 分配的内存是否释放,尤其在错误处理路径上(对非JAVA类)
  2. 错误发生时是否所有的对象被释放,如数据库连接、Socket、文件等
  3. 是否同一个对象被释放多次(对非JAVA类)
  4. 代码是否保存准确的对象reference计数(对非JAVA类)

5 线程安全方面检查项

线程安全问题实际涉及两个方面,一个是性能,另一个是资源的一致性,我们需要在这两方面做个权衡,现在就是到了权衡利弊的时候了。

  1. 代码中所有的全局变量是否是线程安全的
  2. 需要被多个线程访问的对象是否线程安全,检查有无通过同步方法保护
  3.  同步对象上的锁是否按相同的顺序获得和释放以避免死锁,注意错误处理代码
  4.  是否存在可能的死锁或是竞争,当用到多个锁时,避免出现类似情况:线程A获得锁1、然后锁2、线程B获得锁2、然后锁1
  5. 在保证线程安全的同时,要注意避免过度使用同步,导致性能降低

6 程序流程方面检查项

  1. 循环结束条件是否准确
  2. 是否避免了死循环的产生
  3. 对循环的处理是否合适,如循环变量、局部对象、循环次数等能够考虑到性能方面的影响

7 数据库处理方面

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

  1. 数据库设计或SQL语句是否便于移植(注意和性能方面会存在冲突)
  2. 数据库资源是否正常关闭和释放
  3. 数据库访问模块是否正确封装,便于管理和提高性能
  4. 是否采用合适的事务隔离级别
  5. 是否采用存储过程以提高性能
  6. 是否采用PreparedStatement以提高性能

8 通讯方面检查项

  1. socket通讯是否存在长期阻塞问题
  2. 发送接收的数据流是否采用缓冲机制
  3. socket超时处理,异常处理
  4. 数据传输的流量控制问题

9 JAVA对象处理方面检查项

这个检查项的基础是对JAVA对象有较深的理解,但现实是很多看过《Thinking in Java》的程序员,仍然在程序中无法区分传值和传引用,以及对象和reference的区别。这或许就是理论和实践难以结合的问题啊。正所谓知而不行,非真知也。

  1. 对象生命周期的处理,是否对象的reference已经失效,能够设置为null,并被回收
  2. 在对象的传值和传参方面有无问题,对象的clone方法使用是否过度
  3. 是否大量经常的创建临时对象
  4. 是否尽量使用局部对象(堆栈对象)
  5. 在只需要对象reference的地方是否创建了新的对象实例

10 异常处理方面检查项

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

  1. 每次当方法返回时是否正确处理了异常,如最简单的处理,记录日志到日志文件中
  2. 是否对数据的值和范围是否合法进行校验,包括采用断言(assertion)
  3. 在出错路径上是否所有的资源和内存都已经释放
  4. 所有抛出的异常都得到正确的处理,特别是对子方法抛出的异常,在整个调用栈中必须能够被捕捉并处理
  5. 当调用导致错误发生时,方法的调用者应该得到一个通知
  6. 不要忘了对错误处理部分的代码进行测试,很多代码在正常情况下执行良好,而一旦出错,整个系统就崩溃了

11 方法(函数)方面检查项

  1. 方法的参数是否都做了校验
  2. 数组类结构是否做了边界校验
  3. 变量在使用前是否做了初始化
  4. 返回堆对象的reference,不要返回栈对象的reference
  5. 方法API是否被良好定义,即是否尽量面向接口编程、便于维护和重构

12 安全方面检查项

  1. 对命令行执行的代码,需要详细检查命令行参数
  2. web类程序检查是否对访问参数进行合法性验证
  3. 重要信息的保存是否选用合适的加密算法
  4. 通讯时考虑是否选用安全的通讯方式

13 其他

  1. 日志是否正常输出和控制
  2. 配置信息如何获得,是否有硬编码

三、总结

通过在项目中实施Code Review将为我们带来多方面的好处,表现在提高代码质量,保证项目或产品的稳定性,开发经验的积累等,具体的实施当然也要看项目的实际情况,因为 Code Review也是需要成本的,这方面属于Code Review过程的问题,将在其他文章中进行探讨。 

分享到:
评论

相关推荐

    java+sql server项目之科帮网计算机配件报价系统源代码.zip

    sql server+java项目之科帮网计算机配件报价系统源代码

    【java毕业设计】智慧社区老人健康监测门户.zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

    【java毕业设计】智慧社区心理咨询平台(源代码+论文+PPT模板).zip

    zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。

    计算机系统基础实验LinkLab实验及解答:深入理解ELF文件与链接过程

    内容概要:本文档详细介绍了LinkLab实验的五个阶段,涵盖了ELF文件的组成、符号表的理解、代码节与重定位位置的修改等内容。每个阶段都有具体的实验要求和步骤,帮助学生理解链接的基本概念和链接过程中涉及的各项技术细节。 适合人群:计算机科学专业的本科生,特别是正在修读《计算机系统基础》课程的学生。 使用场景及目标:① 通过实际操作加深对链接过程和ELF文件的理解;② 掌握使用readelf、objdump和hexedit等工具的技巧;③ 实现特定输出以验证实验结果。 阅读建议:实验过程中的每个阶段都有明确的目标和提示,学生应按照步骤逐步操作,并结合反汇编代码和二进制编辑工具进行实践。在完成每个阶段的实验后,应及时记录实验结果和遇到的问题,以便于总结和反思。

    基于关键词的历时百度搜索指数自动采集资料齐全+详细文档+高分项目+源码.zip

    【资源说明】 基于关键词的历时百度搜索指数自动采集资料齐全+详细文档+高分项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    用C语言写出一个简单的圣诞树,让你的朋友们体验一下程序员的浪漫,点开即令哦!

    第一次发文的小白,解释的不好,各位大佬勿怪哦

    免费下载:Hilma af Klint a Biography (Julia Voss)_tFy2T.zip

    免费下载:Hilma af Klint a Biography (Julia Voss)_tFy2T.zip

    屏幕截图 2024-12-21 172527.png

    屏幕截图 2024-12-21 172527

    2024级涉外护理7班马天爱劳动实践总结1.docx

    2024级涉外护理7班马天爱劳动实践总结1.docx

    IndexOutOfBoundsException(解决方案).md

    IndexOutOfBoundsException(解决方案)

    【java毕业设计】智慧社区垃圾分类门户.zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

    【java毕业设计】智慧社区网端门户(源代码+论文+PPT模板).zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

    【java毕业设计】智慧社区智慧养老照护系统(源代码+论文+PPT模板).zip

    zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。

    Delphi 12 控件之DevExpressVCLProductDemos-24.2.3.exe

    DevExpressVCLProductDemos-24.2.3.exe

    计算机语言学中并查集数据结构的C++实现

    欢迎下载

    【java毕业设计】智慧社区养老服务平台.zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

    小米15pro工程固件 可以用于修改参数 修复tee损坏 修复底层分区 会用的下载

    资源描述: 机型代码:haotian 1-----工程固件可以用于修改参数 开启diag端口。可以用于修复tee损坏以及修复底层分区。 2-----此固件是完整官方。不是第三方打包。请知悉 3-----此固件可以解锁bl后fast模式刷写。也可以底层深刷。也可以编程器写入 4-----请会用此固件 了解工程固件常识以及会用的朋友下载。 5-----个别高版本深刷需要授权才可以刷入。需要自己会刷写。 6------资源有可复制性。下载后不支持退。请考虑清楚在下载哦 工程资源常识可以参考博文:https://blog.csdn.net/u011283906/article/details/141815378 了解基本

    JSP论文格式化系统_——后台模块的设计与实现(源代码+论文)(2024gk).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    html+css网页设计 美食 蛋糕美食7个页面

    预览地址:https://blog.csdn.net/qq_42431718/article/details/144633992 html+css网页设计 美食 蛋糕美食7个页面

    【java毕业设计】智慧社区居民意见门户.zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

Global site tag (gtag.js) - Google Analytics