可以用定制规则扩展 CheckStyle,所以也可以容易地实施编码规则。而且,它是自动执行的!
图 1 显示了使用 Ant 生成的 CheckStyle 报告的一个示例,这是 清单 1 中所演示的 xslt
任务:
图 1. CheckStyle HTML 报告
|
面向对象编程的一个主要目的是通过创建可以适应不同上下文的可重用对象来促进重用。但是,通常使用的是 “复制-粘贴” 编程,并将它伪装成 “重用”。有时,出现这种情况是因为开发人员不知道有可重用的组件,而其他时候,则是因为提供了“快速修复”。所以,如果需要进行修改,则必须将更改应用到所有 副本和变体中(当然,如果没有工具很难完成)。这种手工方式带来了维护困难并很容易导致遗漏,甚至会带来缺陷。
CPD 是流行的开源静态分析工具 PMD 的一部分,它报告代码基中重复行的数量。此外,CPD 的标志阈值是可配置的,这意味着可以修改 CPD 建议的重复行数。例如,如果将阈值设置成 100 个标志,CPD 就会在至少 重复了 100 个标志的时候显示一个实例。不过请记住,源代码总是会包含一些重复部分;CPD 只是为团队提供了一种调查值得考虑的代码重复 领域的手段,在这个领域内,可以采取纠正措施,例如有目的的重构。
清单 3 演示将 CPD 用于 Ant 的实际使用。CPD 任务需要的第一个选项是 minimumTokenCount
属性,该属性用于指定要比较的标志的数量(最小值是一个标志)。另外,可以设置 CPD 忽略某些代码选项,例如标识符和标量。在这个示例中,Ant fileset
类型指定了 CPD 文件应该分析哪些文件,以及应该忽略哪些文件。
清单 3. 将 CPD 用于 Ant
<taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" classpathref="pmd.classpath" /> <cpd minimumTokenCount="100" format="xml" language="java" ignoreIdentifiers="true" ignoreLiterals="true" outputFile="${basedir}/cpd.xml"> <fileset dir="${src.dir}"> <include name="**/*.java" /> <include name="**/*.jsp" /> <include name="**/*.xml" /> <exclude name="**/*Test*.java" /> </fileset> </cpd> |
如图 2 所示,cpd.xml 是用清单 3 中的 outputFile
属性产生的输出。以后我还将向 CPD 添加 XSL,以生成 HTML 报告。
图 2. 显示代码重复违规的 CPD XML 输出
除了最明显的复制-粘贴违规之外,在所有地方手工查找重复代码也非常具有挑战性。但是,使用诸如 CPD 之类的工具,就可以迅速找出重复代码,然后对此进行改进。
|
许多研究已经证实,随着方法中路径数量的增加,理解和维护同一方法的难度也随之增加。结果,代码越难以理解和维护,就越容易出现缺陷。
JavaNCSS 是一个免费工具,提供了不同的代码测量,例如非注释性源代码语句(或代码行)的数量、所有分析过的方法的圈复杂度量值(cyclomatic complexity number)。清单 4 演示了 JavaNCSS 的使用,可以看到,它不是很难使用。只要将 JavaNCSS 指向一个包含源代码的目录,让它自己处理就行了!
清单 4. 将 JavaNCSS 用于 Ant
<path id="javancss.classpath"> <fileset dir="${lib.dir}" /></path><taskdef name="javancss" classpathref="javancss.classpath" classname="javancss.JavancssAntTask"></taskdef><javancss srcdir="${src.dir}" generateReport="true" outputfile="${javancss.report.dir}/javancss_metrics.xml" format="xml"/> |
像多数软件检查器一样,这里生成了一个 XML 文件,可以通过 XSLT 很容易地将它转换成一个 HTML 报告,就像图 3 中所做的那样:
图 3. JavaNCSS HTML 报告
理解应用程序代码复杂性可没有那么容易。实际上,在某些情况下,复杂性的值可能会令人误解。例如,有些工具为 switch
语句提供较高的值。但是我发现,使用 JavaNCSS 这样的工具,有助于降低高复杂性的领域,最终提高代码的可理解性和可维护性。
文章来源于领测软件测试网 https://www.ltesting.net/