实验四 代码评审

实验四 代码评审

一、实验目的

1) 了解代码审查的含义;

2) 掌握相关编程规范检查工具的安装与使用;

二、实验内容及要求

Code Review中文应该译作“代码审查”或是“代码评审”或“代码复查”,是指通过阅读代码来检查源代码与编码标准的符合性以及代码质量的活动。Code Review主要用来在软件工程过程中改进代码质量,通过代码评审可以达到如下目的:

●在项目早期就能够发现代码中的BUG

●帮助初级开发人员学习高级开发人员的经验,达到知识共享

●避免开发人员犯一些很常见,很普通的错误

●保证项目组人员的良好沟通

●项目或产品的代码更容易维护

     代码评审主要内容是编程规范,重构方法,架构设计,性能安全,日志,可读性,扩展性等问题。通过代码评审可查找和修复引入到开发阶段的应用程序的错误,提高软件的整体素质和开发者的技能。代码评审的作用和意义已在很多技术团队内达成共识,可是很多时候并未被有效执行,甚至被认为是一项费时费力的工作。借助一些工具可以更容易,更有效率地来进行Code Review。

1、以小组形式,针对前面“实验一”中所完成的代码,进行代码评审(走查),重点检查以下情况。你也可有查询相关材料,建立更细化的检查清单(check list)

- 程序是否能正常工作,代码是否实现预期的功能,逻辑是否正确。

- 代码是否遵循的编程规范

- 代码是否尽可能的模块化

- 所有的数据输入是否都进行了检查

- 是否有注释,并且描述了代码的意图

- 代码的可理解性和可测试性

2、按“实验二”的分组方式,两人一组,随机分配另一组的代码作为本组评审和分析的对象

一些编码规范的检查工具如下,也可自行查找工具使用。

java语言      

- 采用使用eclipse Checkstyle插件 

- CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要但枯燥的任务中解脱出来。它可以根据设置好的编码规则来检查代码。比如符合规范的变量命名,方法体的最大行数,重复代码检查等等。

C++语言

- 可使用Google代码规范工具Cpplint。

- Cpplint是一个python脚本,Google使用它作为自己的C++代码规范检查工具,VSCcode可配置Cpplint对C++代码进行规范检查。

python

- 可采用pylint

- Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码。目前在 eclipse 的 pydev 插件中也集成了 Pylint,VSCcode可安装pylint插件

    当发现了项目存在的问题后,可通过Bug跟踪系统向项目维护者反馈问题(issue),管理Issue的系统称为BTS(Bug Tracking System,Bug跟踪系统)。当今具有代表性的BTS有Redmine、Trac、BugZilla等。GitHub自身也加入了BTS的功能。在GitHub上,可以将它作为软件开发者之间的交流工具。通过github的issues功能开发者可以便捷的发现软件的BUG并报告,想向项目所有人询问或用来追踪各种想法探讨准备实施的任务。

三、实验过程

(1)配置代码审查工具。要求采用屏幕截图的方式配置的过程

 评审代码小组的github地址:https://github.com/Wjinfiny/daimaqiaobu

 由于需要审查的代码是用C++语言完成的,所以采用cpplint工具来完成代码审查工作

  •  下载cpplint.py脚本

  •  下载Python2.7并配置环境变量

  •  在cmd中输入Python发现Python环境变量配置成功

  •  使用cmd输入命令来对代码进行评审

(2)使用工具对原始代码进行评审和分析,记录结果,期间不要有任何修改

  •  在cmd中输入“D:cpplintcpplint.py F:daimaqiaobuWjinfinydaimaqiaobuduisizeyunsuan.cpp”(cpplint.py的位置和cpp代码所处的位置)

  •  观察到工具对原始代码进行评审和分析结果如下,发现一共找到了174个error(其中许多的错误都是相同的)

(3)对工具执行结果进行人工分析,结合检查清单和人工走查得出代码修改建议

  测试代码是否可以成功运行:经测试发现四则运算可以成功运行,但是不支持计算带()的题目

  对工具执行结果进行人工分析:

  • Missing space before (in  if(                              在if与(间缺少空格
  • Else clause should never be on same line as else                     else子句不应该与else处于同一行
  • Weird number of spaces at line-start .Are you  using a 2-space indent      行首的空格数很奇怪,你是否使用了2位缩进
  • Line ends in whitspace. Consider deleting these extra spaces            行尾为空格,考虑删除这些多余的空格
  • { should almost always be at the end of the previous line               { 应该几乎总是在上一行的末尾
  • Missing space before (in  switch(                             在switch与(间缺少空格
  • Tab found;better to use spaces                                发现tab键,最好使用空格键
  • Missing space around <                                      在<周围缺少空格
  • Missing space around =                                      在=周围缺少空格
  • If/else  bodies with multiple statements require braces                具有多个语句的if / else主体需要大括号
  • Missing space around = =                                     在==周围缺少空格
  • At least two spaces is best between code and comments                  代码和注释之间最好至少有两个空格
  • Missing space before (in  while(                              在while与(间缺少空格
  • An else should appear on the same line as the preceding }               一个else应该出现在与前面 }相同的行上
  • Redundant blank line at the end of a code block should be deleted          代码块末尾的多余空白行应删除
  • Missing space before (in  for(                               在for与(间缺少空格
  • Missing space after ,                                      在逗号后缺少空格
  • Missing space after ;                                      在分号后缺少空格
  • Missing space before {                                      在{前缺少空格
  • Missing space around >=                                      在>=周围缺少空格
  • If an else has a brace on one side,it should have it on both            如果一个else一边有括号,另一边也要有
  • Line contains invalid UTF-8 (or Unicode replacement character)          行中包含无效的UTF-8(或Unicode替换字符)→代码的中文注释报错

  代码修改建议:

  • 在if、switch、while、for与(间添加一个空格
  • 在<、=、==、>=前后添加一个空格
  • else子句与else在两行
  • { 应该放在上一行的末尾,且{}是成对出现的
  • 最好全部空格键来缩进
  • 具有多个语句的if / else主体需要大括号
  • 代码和注释之间最好至少有两个空格
  • 一个else应该出现在与前面 }相同的行上
  • { 不是单独在一行时,在{ 前需要添加一个空格
  • 逗号、分号 需要在其后面添加空格

 经分析发现有许多问题都是与空格有关的,所以建议该小组好好查询一下C语言中与空格有关的代码规范,什么情况下应该添加空格以及添加的位置

(4)通过github issues向项目维护者提交问题(issue),注意一个issue 只报告一个问题,多个问题需放在多个issue中,以便跟踪

       点开问题可以查看到里面的具体内容

(5)记录总结实验过程中遇到的问题和解决过程

分配好代码评审组后,去将第三组的代码clone到本地后发现是使用C++语言写的,根据实验内容的提示查找了许多cpplint的资料,并为之下载了vscode,由于电脑以前无法下载Python,而cpplint是Python的一个脚本,所以我又在网上查找了许多关于c的代码审查工具,下载了一个cppcheck工具后,用它来对代码审查发现它只出现了一个warning:scanf without field width limits can crash with huge input data.没有字段宽度限制的scanf可能会因大量输入数据而崩溃。

经过再次尝试,下载Python27后,在网络上找到了将cpplint嵌入到VScode和VS2008中使用的方法,按照操作出现了错误,并未得到代码审查结果

通过阅读博客园中同学的博客发现可以直接使用cmd来输入命令实现代码审查操作

四、实验小结

  通过这次实验我掌握了cpplint的安装和运用,可以直接使用命令行“cpplint.py和代码所处位置”来对代码进行审查;代码审查在项目的开发过程中是很重要的,它在提升代码质量的同时,也可以提高程序员本身的能力;在审查别人代码的时候,使自身对代码的一些规范有了更加深刻的记忆,发现了许多自己在写代码时容易疏忽的地方,对以后自己在编写代码时的规范方面有很大的提升。

原文地址:https://www.cnblogs.com/lhl2z/p/12775331.html