点击蓝字关注我们

引言
为了全面提升软件的质量,提升软件开发人员的代码编写水平,最近我们在全面推进代码审核的机制,虽然这是一件非常好的事情,但是对代码审核者来说则是一件繁琐的事情,经常性不得不花费大量的时间和精力去纠正各式各样的代码缺陷。而 Java 代码规范工具则能够在代码编写的过程中帮助开发人员快速有效的定位代码缺陷,协助开发人员快速修复缺陷,在提高软件的可靠性的同时,减少代码审核者的负荷。目前市场上代码规范工具繁多,本文将介绍主流的4种工具(CheckStyle,Alibaba Java Coding Guideline,SonarLint和PMD),在功能和特性方面对它们进行比较,帮助开发人员了解这些工具,从中选取对合适自己的工具并应用到开发中。
代码规范工具简介
代码规范工具能够作用于静态的代码,检查和分析代码的语法、接口、结构、控制流等,找出代码的潜在性错误和缺陷,例如空指针、方法/函数行数超长、重复代码块等等。在软件开发过程中,如果在代码测试之前进行代码规范检查和缺陷修复,可以极大的减少测试的工作量和成本。统计证明,至少30%的代码缺陷是可以通过工具对静态代码分析来发现和修复的。通过使用代码规范工具,可以帮助软件开发人员及早定位代码隐藏的错误和缺陷,指导开发者快速修复缺陷;同时可以减少代码审核者的负荷,让其更专注于业务逻辑、设计模式上的审核;还可以提高软件的可靠性,节省测试成本、缺陷修复成本和总体开发成本。
主流的代码规范工具
CheckStyle
CheckStyle 是 SourceForge 下的一个开源项目,提供了一个帮助 JAVA 开发人员遵守某些编码规范的工具,检查范围包括命名规则、类设计、方法区块大小、Javadoc 等。它能够自动化代码规范检查过程,从而使得开发人员从这项非常重要但却枯燥繁重的任务中解脱出来。
Checkstyle 可以检查源代码的许多方面。它可以找到类设计问题,方法设计问题。它还能够检查代码布局和格式问题。可在下面的链接获得详细的检查列表:https://checkstyle.sourceforge.io/checks.html
Checkstyle 提供了支持大多数常见 IDE (如 Eclipse,IDEA)的插件,文本主要使用 IDEA中的 Checkstyle 插件。安装方式:进入Settings >> Plugins >> Marketplace...,然后在 Merketplace 中搜索 CheckStyle-IDEA,点击Install,安装完后重启IDEA即可在IDEA底部的 ‘CheckStyle’ 看到它的功能按钮,点击
即可开始检查代码。


Checkstyle 具有高度可配置性,可以支持几乎任何编码标准。一个典型的配置就是使用内置的 Google Java Style 或 SUN Checks编码规范。如下图所示,Checkstyle 使用 Google Java Style 对代码进行编码风格检查,并将检查结果显示在IDEA底下 ‘CheckStyle’ 视图中;Checkstyle 还支持实时代码扫描。无论是手动检查还是实时检查,找到的代码缺陷都会高亮在代码编辑器中和右侧的代码滚动条上。开发人员可点击查看错误或警告的描述。

除了作为 IDE 的插件外,CheckStyle 还能集成到项目的构建过程中,通过强制执行代码库的编码标准作为代码质量的一个门槛,如果未达到规定的质量门槛则项目构建失败。具体配置可以参考:http://maven.apache.org/plugins/maven-checkstyle-plugin/
Alibaba Java Coding Guideline
Java 代码规约扫描插件以阿里巴巴发布的《阿里巴巴 Java 开发规约》为标准,作为 Eclipse、IDEA 的插件形式存在,检测 JAVA代码中存在不规范得位置然后给予提示。该插件在扫描代码后,将不符合开发规约的代码按 Blocker / Critical / Major 三个等级显示在下方;提供了实时检测功能,编写代码的同时也能快速发现问题所在;对于历史代码,部分规则实现了批量一键修复的功能,提升代码质量,提高团队研发效能;支持中英双语,更接地气。
安装方式类似Checkstyle,在Marketplace搜索Alibaba Java Coding Guideline即可点击安装。安装后完成后,需要重启 IDEA,重启后就可以在菜单栏中看到它的功能按钮
,有三种方式可以扫描代码:
在项目目录上右键点击 popup 出来的菜单里会出现这两个功能按钮,点击绿色的按钮即可开始扫描代码。
如果不想全部扫描,只扫描当前编辑的文件的话,在当前文件面板中点击右键也会出现此功能按钮。
前两种方式是手动检测,插件也提供了实时监测的功能,此功能默认开启,一旦开启则会在你编写代码时就会实时监测,一旦有不符合规范的语句就会出现错误提示。
当 Alibaba 插件对项目代码进行编码风格检查完后,其检查结果显示在 IDEA 底下 ‘Inspection Result’ 视图中,如下图所示;点击警告信息,右侧将缺陷代码片段显示出来,同时找到的代码缺陷也会高亮在代码编辑器中和右侧的代码滚动条上。开发人员可点击查看警告的详细信息,按 “Crtl+F1” 后会显示修复建议以及良好代码的例子,同时针对一些简单的缺陷代码还带有一键修复的功能。

CheckStyle
SonarLint 是一款强大快速的能帮助开发者发现代码里的 bug 或是代码质量优化点的扩展工具。支持很多主流的语言:JAVA、js、PHP、Python。也支持主流的 IDE 们,IDEA、Eclipse、VS。它具有如下的特点:
Bug 检测:受益于成千上万的规则( https://rules.sonarsource.com/ );这些规则能够检测各种常见的、棘手的错误以及各种已知的漏洞。
实时反馈:开发者编码时,它即可实时检测并通过高亮缺陷代码报告问题,就像实时拼写检查器一样。
让开发者知道要做什么:SonarLint 精确指出问题所在,并为您提供有关如何解决问题的建议。
从错误中吸取教训:丰富的文档可让您详细了解问题并发现编码最佳实践。
揭开历史问题:查看已存在的问题,并成为修复它们的英雄。
易使用:无需配置,只需从 IDE 市场安装 SonarLint 并继续编码即可。
SonarLint 的安装类似于其他插件,在 Marketplace 搜索 “SonarLint” 即可点击安装,安装后完成后重启 Injellij 。重启后在项目目录上或编辑器中单击右键,popup 菜单栏中看到它的功能按钮。

SonarLint 支持两种模式:独立模式和连接模式。
独立模式:使用插件内置规则进行检查;
优点:无须配置,开箱即用,检查速度快;
缺点:内置规则与 SonarQube 服务器规则的不一致,会造成检查结果的不一致。
连接模式:需连接 SonarQube 服务器;
优点:简单配置后,即可使用 SonarQube 服务器的规则和配置项进行检查,检查结果保持最大一致。
缺点:项目需接入 SonarQube
和Alibaba的插件类似,当 SonarLint 插件对项目代码进行编码风格检查完后,其检查结果显示在 IDEA 底部 ‘SonarLint’ 窗口中,如下图所示;点击警告信息,右侧可显示规则的描述和缺陷代码片段显示出来,同时找到的代码缺陷也会高亮在代码编辑器中和右侧的代码滚动条上。开发人员可点击查看警告的详细信息,按 “Crtl+F1” 后会显示违反的规则详情以及修复建议。此外,SonarLint 还有许多选项如:排除不想分析的文件;只分析特定的一组文件,如只分析修改过的文件;按需激活或关闭规则。

PMD
PMD 是一款可扩展跨语言静态源代码分析器。它能找到常见的编程缺陷,如未使用的变量,空的 catch 块,不必要的对象创建等等。它支持 Java,JavaScript,Salesforce.com Apex 和 Visualforce,PLSQL,Apache Velocity,XML,XSL。
PMD 除了提供支持各种和 IDE 如 Eclipse、IDEA 集成的插件,它 通过其内置的编码规则对 Java 代码进行静态检查,主要包括对潜在的 bug,未使用的代码,重复的代码,循环体创建新对象等问题的检验。
PMD的IDE插件安装类似于其他插件,在 Marketplace 搜索 “PMDPlugin” 即可点击安装,安装后完成后重启Injellij。重启后在项目目录上单击右键,popup 菜单栏中即看到它的功能按钮
当 PMD 插件对项目代码进行编码风格检查完后,其检查结果显示在IDEA底部 ‘PMD’ 窗口中,如下图所示;双击警告信息后可以跳到相应的缺陷代码行。与 Alibaba 和 SonarLint 插件不同的是,它不能在代码编辑器中高亮缺陷代码,以及没有提供更详细的缺陷描述和修复建议。

除了作为 IDE 的插件外,PMD 和 CheckStyle 一样,还能集成到项目的构建过程中,通过强制执行代码库的编码标准作为代码质量的一个门槛。它可以应用到 Maven goal、Ant task、Gradle task上 ,同时 PMD也提供了 command-line 的方式检查分析代码。
除了 PMD 自带的代码规范的规则外,还可以自定义规则,开发人员可以把这些规则整合到一起,按照需求进行代码检查。

Java代码规范工具对比
下面将从安装,易用性,特点以及代码缺陷检查能力等方面进行对比。代码缺陷检查能力为重点对比点,本文将通过一段测试代码进行试验。
测试代码
如下测试代码 TestCodeChecker.java 中将包含开发中的几种常见错误,如引用操作、对象操作、表达式复杂化、数组使用、未使用变量或代码段、资源回收、方法调用及代码设计几个方面。所有的缺陷检查都是用工具的默认检查规范设置,代码的注释部分列举了代码中可能存在的缺陷。


对比结果表


总结
本文从安装、菜单项和 GUI 界面、工具的特点以及使用方式几个方面详细介绍了 Checkstyle,Alibaba Java Coding Guideline,PMD 四种主流的 Java 代码规范工具,并通过一段 Java 测试代码对这四种工具的代码分析能力进行比较。这四种工具内置不同编程规范,对不同种类的代码问题的发现能力有所不同,对于代码检查各有侧重:Checkstyle 和 Alibaba 更加偏重于代码编写格式检查,而 SonarLint,PMD 着重于发现代码缺陷。个人建议是将这两种侧重点不同的工具组合起来一起使用,例如【Alibaba+SonarLint】或【Checkstyle+PMD】,这样才能较全面的发现和修复代码问题。就本人而言,比较偏向于使用【Alibaba+SonarLint】的组合,因为这两种工具都提供了缺陷详细信息、代码例子和修复建议,对于开发者十分友好,另一个重要的特性是 SonarLint 可以和 SonarQube 服务器连接,使用统一的编程规范检查代码。
最后,希望本文能够帮助 Java 软件开发和测试人员了解以上四种代码规范工具,从中选择使用,从而提高代码开发、审核和测试的效率。




