代码检测:Code Review与CheckStyle
2009-02-14 16:34
260 查看
本文向大家介绍Code Review的主要内容,以及流行的检查Code Conventions的工具。同时,对于目前应用最为广泛的CheckStyle的应用给出详细的介绍,也列举了很多使用CheckStyle的最佳实践。
一、Code Review & Code Conventions
质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤其是企业应用软件系统来说,除了软件运行质量、文档质量以外,代码的质量也是非常重要的。软件开发进行到编码阶段的时候,最大的风险就在于如何保证代码的易读性和一致性,从而使得软件的维护的代价不会很高。
在软件开发的过程中,以下几种情形随处可见:
1) 软件维护时间长,而且维护人员的积极性不高:
做过软件维护的开发人员,尤其是在接手不是自己开发产品的源码的时候,即使有良好的文档说明,仍然会对代码中冗长、没有注释的段落“叹为观止”。理解尚且如此困难,何况要修改或者增加新的功能。因此,很多开发人员不愿意进行软件维护的工作。
2)新的开发人员融入团队的时间比较长:
除了没有良好的培训、文档等有效的机制以外,每个人一套的编码风格,也容易造成新成员对于已有代码的理解不够,甚至出现偏差。
编码规范,作为解决以上问题的方案已经得到了很长时间的应用。而在产品或者项目实际开发的过程中,仅有Code Conventions是不能解决Code的问题的。它往往和Code Review配合,作为代码质量保证的手段。
1.1. Code Review的层次与内容
Code Review就是审查代码的质量。根据形式分为两种,一种是交叉代码审查,就是自己的代码由他人来检查,就象检查作业一样;另一种是代码会审,就是以会议的形式,大家共同审核代码的质量。
Code Review 的目的有:
·在项目早期就能够发现代码中的BUG;
·帮助初级开发人员学习高级开发人员的经验,达到知识共享;
·避免开发人员犯一些很常见,很普通的错误;
·保证项目组人员的良好沟通;
·项目或产品的代码更容易维护;
一般情况下,Code Review的内容与层次如下:
·编码风格与代码规范一致性:检查代码是否符合编码规范,确保所有人写的代码基本一致;
·代码满足基本的功能要求:检查代码的逻辑实现,以及单元测试的编写策略,确认实现功能性需求;
·代码满足性能等非功能性需求:非功能性需求一般不便于测试,需要借助一定的工具和Review人员的素质,针对编码中对于性能影响的瓶颈给出解决方案;
·去除冗余,提高代码可读性:适当使用 Refactorying技术,去除代码中的Bad Smell;如果有需要,可以Refactorying to Pattern。
1.2. Code Conventions的尴尬境地
从Code Review的层次分析中我们可以看到,Code Conventions是其基础。而实际的情况是,在软件开发中,两者都沦为“宣传口号”,而非切实执行的实践。
造成这种情形的原因有二:
1. Code Conventions是开发过程的“道德”而非“法律”:很多时候,由于没有有效的工具或者辅助手段的支持,是否遵守编码规范是依靠开发人员的“道德素养”-自觉遵守,而非实际考核的指标;
2. Code Review的基石不牢:在第一种原因的影响下,Code Review执行的过程中,如果花费了大量的时间在代码规范的检查上,那么对于更为重要的程序执行逻辑、性能、易读性等的评审投入的精力就有限的;而这种情况反过来也使得对于编码规范的检查,通常都是走过场。最后,还是每个人一套规范,只要最终交付的产品完成指定的功能就可以啦。
二、CheckStyle
面对以上描述的Code Conventions的尴尬境地,陆续有开发人员提出了自己的解决方案。目前,对于JAVA的代码规范的检查,已经有很多成熟的工具,例如CheckStyle、PMD以及Jalopy等[3]。其中,CheckStyle的应用非常广泛,众多开源项目都使用它作为检查代码规范的工具,尤其是 Jakarta 的很多项目,例如Maven、 Torque等。
2.1. CheckStyle是什么?
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来[1]。
2.2. CheckStyle检验的主要内容
CheckStyle默认提供一下主要检查内容:
·Javadoc注释
·命名约定
·标题
·Import语句
·体积大小
·空白
·修饰符
·块
·代码问题
·类设计
·混合检查(包活一些有用的比如非必须的System.out和printstackTrace)
从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大。
2.3. CheckStyle的主要运行方式
目前,CheckStyle的版本是3.0,与以前的版本不同,它的配置文件是基于XML而非Properties文件。
它的3.0版本提供了两种运行的方式:
·命令行工具
·ANT任务
同时,CheckStyle目前有很多针对流行IDE的插件,例如Eclipse、IntelliJ IDEA、JBuilder等。但是,大部分都是基于2.4的版本,新版本的特性不支持,同时配置也较为复杂。
因为一般情况下,如果与开发过程与环境集成起来,编码规范的检查会更加有效,因此,作为ANT任务的运行方式使用的更加普遍。
在ANT的build.xml文件中添加CheckStyle任务的步骤如下:
1. 将checkstyle-all-3.1.jar拷贝到项目的LIB目录;
2. 建立配置文件;
3. 声明CheckStyle任务:
4. 建立CheckStyle任务:
2.4. 定制CheckStyle
CheckStyle的执行基于XML配置文件,它的主要组成部分是:
·Module:整个配置文件就是一棵Module树。根节点是Checker Module。
·Properties:它来决定一个Module如何进行检查。每个Module都有一个默认值,如果不满足开发需求,可以设定其它的值。
下面是一个示例:
它表示,如果方法或者构造函数的长度超过60行,CheckStyle就会报错。而默认值是150行。
以下是一段CheckStyle对于Maven项目源文件的检查报告:
一般情况下,与IDE集成在一起使用的时候,点击出错的条目,可以跳转到相应的代码。
一、Code Review & Code Conventions
质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤其是企业应用软件系统来说,除了软件运行质量、文档质量以外,代码的质量也是非常重要的。软件开发进行到编码阶段的时候,最大的风险就在于如何保证代码的易读性和一致性,从而使得软件的维护的代价不会很高。
在软件开发的过程中,以下几种情形随处可见:
1) 软件维护时间长,而且维护人员的积极性不高:
做过软件维护的开发人员,尤其是在接手不是自己开发产品的源码的时候,即使有良好的文档说明,仍然会对代码中冗长、没有注释的段落“叹为观止”。理解尚且如此困难,何况要修改或者增加新的功能。因此,很多开发人员不愿意进行软件维护的工作。
2)新的开发人员融入团队的时间比较长:
除了没有良好的培训、文档等有效的机制以外,每个人一套的编码风格,也容易造成新成员对于已有代码的理解不够,甚至出现偏差。
编码规范,作为解决以上问题的方案已经得到了很长时间的应用。而在产品或者项目实际开发的过程中,仅有Code Conventions是不能解决Code的问题的。它往往和Code Review配合,作为代码质量保证的手段。
1.1. Code Review的层次与内容
Code Review就是审查代码的质量。根据形式分为两种,一种是交叉代码审查,就是自己的代码由他人来检查,就象检查作业一样;另一种是代码会审,就是以会议的形式,大家共同审核代码的质量。
Code Review 的目的有:
·在项目早期就能够发现代码中的BUG;
·帮助初级开发人员学习高级开发人员的经验,达到知识共享;
·避免开发人员犯一些很常见,很普通的错误;
·保证项目组人员的良好沟通;
·项目或产品的代码更容易维护;
一般情况下,Code Review的内容与层次如下:
·编码风格与代码规范一致性:检查代码是否符合编码规范,确保所有人写的代码基本一致;
·代码满足基本的功能要求:检查代码的逻辑实现,以及单元测试的编写策略,确认实现功能性需求;
·代码满足性能等非功能性需求:非功能性需求一般不便于测试,需要借助一定的工具和Review人员的素质,针对编码中对于性能影响的瓶颈给出解决方案;
·去除冗余,提高代码可读性:适当使用 Refactorying技术,去除代码中的Bad Smell;如果有需要,可以Refactorying to Pattern。
1.2. Code Conventions的尴尬境地
从Code Review的层次分析中我们可以看到,Code Conventions是其基础。而实际的情况是,在软件开发中,两者都沦为“宣传口号”,而非切实执行的实践。
造成这种情形的原因有二:
1. Code Conventions是开发过程的“道德”而非“法律”:很多时候,由于没有有效的工具或者辅助手段的支持,是否遵守编码规范是依靠开发人员的“道德素养”-自觉遵守,而非实际考核的指标;
2. Code Review的基石不牢:在第一种原因的影响下,Code Review执行的过程中,如果花费了大量的时间在代码规范的检查上,那么对于更为重要的程序执行逻辑、性能、易读性等的评审投入的精力就有限的;而这种情况反过来也使得对于编码规范的检查,通常都是走过场。最后,还是每个人一套规范,只要最终交付的产品完成指定的功能就可以啦。
二、CheckStyle
面对以上描述的Code Conventions的尴尬境地,陆续有开发人员提出了自己的解决方案。目前,对于JAVA的代码规范的检查,已经有很多成熟的工具,例如CheckStyle、PMD以及Jalopy等[3]。其中,CheckStyle的应用非常广泛,众多开源项目都使用它作为检查代码规范的工具,尤其是 Jakarta 的很多项目,例如Maven、 Torque等。
2.1. CheckStyle是什么?
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来[1]。
2.2. CheckStyle检验的主要内容
CheckStyle默认提供一下主要检查内容:
·Javadoc注释
·命名约定
·标题
·Import语句
·体积大小
·空白
·修饰符
·块
·代码问题
·类设计
·混合检查(包活一些有用的比如非必须的System.out和printstackTrace)
从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大。
2.3. CheckStyle的主要运行方式
目前,CheckStyle的版本是3.0,与以前的版本不同,它的配置文件是基于XML而非Properties文件。
它的3.0版本提供了两种运行的方式:
·命令行工具
·ANT任务
同时,CheckStyle目前有很多针对流行IDE的插件,例如Eclipse、IntelliJ IDEA、JBuilder等。但是,大部分都是基于2.4的版本,新版本的特性不支持,同时配置也较为复杂。
因为一般情况下,如果与开发过程与环境集成起来,编码规范的检查会更加有效,因此,作为ANT任务的运行方式使用的更加普遍。
在ANT的build.xml文件中添加CheckStyle任务的步骤如下:
1. 将checkstyle-all-3.1.jar拷贝到项目的LIB目录;
2. 建立配置文件;
3. 声明CheckStyle任务:
<taskdef resource="checkstyletask.properties" classpath="${lib}/checkstyle-all-3.1.jar"/> |
<target name="checkstyle"> <checkstyle config="${config}/sun_checks.xml"> <fileset dir="${src}" includes=" **/*.java" /> </checkstyle> </target> |
CheckStyle的执行基于XML配置文件,它的主要组成部分是:
·Module:整个配置文件就是一棵Module树。根节点是Checker Module。
·Properties:它来决定一个Module如何进行检查。每个Module都有一个默认值,如果不满足开发需求,可以设定其它的值。
下面是一个示例:
<module name="MethodLength"> <property name="max" value="60"/> </module> |
以下是一段CheckStyle对于Maven项目源文件的检查报告:
Method 'createExpression' is not designed for extension - needs to be abstract, final or empty. 91 Unable to get class information for JellyException. 91 Line has trailing spaces. 93 Line has trailing spaces. 104 Method 'evaluate' is not designed for extension - needs to be abstract, final or empty. 113 Parameter context should be final. 113 Line has trailing spaces. 130 Method 'getExpressionText' is not designed for extension - needs to be abstract, final or empty. 131 Line has trailing spaces. 134 Line has trailing spaces. 135 Method 'toString' is not designed for extension - needs to be abstract, final or empty. 137 Method 'isSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 156 Method 'setSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 168 Parameter supportAntVariables should be final. 168 'supportAntVariables' hides a field. 168 Method 'isValidAntVariableName' is not designed for extension - needs to be abstract, final or empty. 183 Parameter text should be final. 183 |
相关文章推荐
- 【转】 代码检测:Code Review与CheckStyle
- 代码检测工具箱——checkstyle、findbugs、pmd-cpd
- 符合阿里巴巴代码规范的checkstyle检测文件
- 代码检测工具箱——checkstyle、findbugs、pmd-cpd
- 代码质量检测工具FindBugs、PMD和CheckStyle对比
- 符合阿里巴巴代码规范的checkstyle检测文件
- java进阶(三)------java编程规范---代码质量检测工具FindBugs、PMD和CheckStyle对比
- java进阶(四)------java编程规范---代码质量检测工具FindBugs、PMD和CheckStyle的安装
- 干货!Jenkins下配置findbugs、pmd及checkstyle实现代码自动检测
- java进阶(三)------java编程规范---代码质量检测工具FindBugs、PMD和CheckStyle对比
- java进阶(四)------java编程规范---代码质量检测工具FindBugs、PMD和CheckStyle的安装
- Checkstyle, FindBugs, PMD, VisualVM四种代码检测工具的比较与相关心得
- 检测模板的使用权限 Monxin专用(PHP代码函数)
- Bullet3物理引擎碰撞检测相关代码片段
- 精彩代码回放:jQuery实现的浏览器类型和版本检测
- 从客户端检测到有潜在危险的Request.Form值的asp.net代码
- 使用Docker搭建SonarQube检测代码质量
- 普通恶意代码技术分析与检测
- Eclipse代码规范工具-Checkstyle安装和使用