检测重复代码的工具(Java)
我在一个项目中,以前的程序员已经遍地都是复制粘贴代码。 这些代码实际上是相同的(或非常相似),它们可以被重构为一个。
我花了无数个小时手动重构这些代码,但是我认为必须有更好的方法。 有些是非常微不足道的静态方法,可能已经被转移到祖先类(而是复制粘贴由以前的初级程序员遍布)。
是否有一个代码分析工具,可以检测到这一点,并提供报告/build议? 如果可能,我更喜欢免费/开源工具。
我使用以下工具:
- PMD / CPD (BSD风格许可证)。
-
Checkstyle (LGPL许可证)– 支持已被删除, 请参阅详细信息 。
这两个工具都有代码重复检测支持。 但他们都缺乏build议你如何重构你的代码的能力。
JetBrains IntelliJ IDEA Ultimate具有良好的代码重复支持的静态代码分析,但它不是免费的。
SonarQube可以检测重复的代码,但不build议删除它们。 它是免费的 – 虽然默认设置,它只能检测词法上相同的克隆 – 有一个免费的SonarQube插件的CodeAnalyzer ,你可以检测到更复杂的结构克隆,而不是词法。
维基百科有关重复代码工具的文章中列出的大多数工具将检测包括Java在内的许多不同语言的重复。
无论是Simian还是PMD的CPD 。 前者支持更多的语言,但对于商业项目来说是免费的。
请参阅我们的SD Java CloneDR ,这是一种用于在大型Java系统中检测精确和差错重复代码的工具。
尽pipe有空白变化,换行符,注释插入删除,常量或标识符的修改,并且在很多情况下甚至用另一个语句或一个语句块来replace一个语句,CloneDR仍将查找代码克隆。
它显示了每个克隆集的位置,每个克隆,具有共同共性的克隆的抽象以及抽象的参数化,以显示每个克隆实例如何从抽象派生。
它在大多数Java系统中发现10-20%的克隆。