【问题标题】:Automated-refactoring tool to find similar duplicate source code for Java/Javascript? [closed]自动重构工具来查找类似的 Java/Javascript 重复源代码? [关闭]
【发布时间】:2016-11-25 06:49:39
【问题描述】:

我正在寻找一种工具来查找 Java/Javascript 的重复或相似代码。我无法说出“similar”的确切定义,但我希望该工具足够智能并给我一些重构代码的建议,例如,

(1) A 类和 B 类具有相似的方法(例如,有 5 个方法具有相同的方法名称、参数和相似的实现出现在两个类中),那么应该建议将这些相似的方法移到基类中。 (2) A 类多次在不同的地方有相似的代码行,工具应该建议将这些相似的代码行移动到一个方法中。

我试过PMD,它可以找到重复的代码行,但它不够聪明。它没有找到在我的一个项目中广泛传播的那些相似源代码。

有这样的工具吗?

【问题讨论】:

  • afaik PMD 有选项来定义它接受的相似度,你试过这些吗?
  • IDEA 是老大!

标签: java duplicates automated-refactoring


【解决方案1】:

我之前没有用过IntelliJ IDEA,但我发现它的终极版支持Analyzing Duplicates

【讨论】:

    【解决方案2】:

    我们的CloneDR 工具通过比较来自解析器的抽象语法树来查找重复代码。 (它有多种语言的特定语言版本,包括 Java 和 JavaScript)。

    这意味着尽管格式更改和克隆主体的修改,它仍然可以找到克隆的代码,这两者通常在克隆时完成。找到的克隆匹配语言概念,例如表达式声明语句函数,甚至类。报告相似的克隆以及差异/变异点作为建议的参数。

    它可以找到具有多个实例的克隆集(我们有一些应用程序包含数百个单个代码的克隆),并且它可以跨许多源文件查找克隆。

    它生成可供人们直接阅读的 HTML 报告,以及可由其他下游工具处理的 XML 报告。 (您可以通过链接查看一些示例 HTML 报告)。

    相似性很难定义,实际上你可以通过多种方式定义它。 CloneDR 将其定义为克隆集中相同元素(技术上是 AST 节点)的比率除以整个克隆集中的元素总数。该比率是一个介于 0 和 1 之间的值。它与阈值进行比较;我们发现,就报告的克隆质量而言,95% 作为阈值具有惊人的稳健性。

    为有趣的克隆建立最小大小很有用。 a*bx*y 的克隆(带有 2 个参数),但由于它太小,因此无法报告。 CloneDR 还使用我们称为“行数”的大小阈值,但实际上是元素中克隆的大小除以整个代码库中每行的平均元素数。这会产生通常比阈值多行的克隆,但它会为一行内的大量表达式找到克隆。我们发现 5-6 条“线”在报告的克隆质量方面也相当可靠。

    此表显示了 CloneDR 的 AST 匹配方法与许多其他克隆检测工具相比的有效性(将其评为“非常好”)。唯一接近的是 CCDIML ...。这是对 CloneDR 方法的学术重新实施。还有其他方法(即基于 PDG 的方法)可以更有效地检测分散的克隆,但在实践中,根据我的个人经验,克隆代码的人通常不会将克隆的部分切割成一堆单独的部分以分散他们;他们太懒了。 YMMV。

    [表格来自:Roy、Cordy、Koschke:代码克隆检测技术和工具的比较和评估:一种定性方法,计算机编程科学,第 74 卷第 7 期,2009 年 5 月。本文概述了许多不同的克隆检测方法并评估其有效性。]

    [PMD 未列出,但显然使用 Rabin-Karp 字符串匹配,根据上表“基于文本”,而不是 AST 匹配。]

    关于 OP 的要求:

    CloneDR(实际上我不知道任何工具)不会在多个方法中找到一组相似的方法,如果这些方法在不同的类中以不同的顺序出现。在这种情况下,CloneDR 更有可能将单个方法报告为克隆;最终结果是一样的。如果成员在不同的类中以相同的顺序依次出现,它将找到这样一个集合,就像一个类主体从另一个类主体被批量复制时发生的那样。

    跨多种方法的相似代码块很常见。生成的报告显示了相似代码块的相关性,包括代码的抽象版本,它本质上是方法体所需的参数化代码块。

    【讨论】:

    • 1.这个“CloneDR”工具不是开源的,充其量是它的免费软件=downvote。 2.你的链接坏了,here是一个新的
    • 他没有要求开源工具。感谢您无缘无故地投反对票。 1. 他要求比他能得到的更好的工具。无论您是否相信,CloneDR 都是基于技术论文分析的此类工作的一个非常好的工具。
    • 2.感谢您指出断开的链接。它曾经工作过;互联网改变了一些规则。您的链接指向 CloneDR 所基于的工具;我修复了指向(再次)指向 CloneDR 工具本身的链接。
    • 尝试使用 clone-doctor 分析一些 ES6 代码。问题:CDR 只支持一些古老的 javascript 方言,称为“MicrosoftNetscape”。转译 ES6 代码不是一种选择。你能至少开源解析器接口吗?所以我们可以添加一个 ES6 解析器,或者构建一个到 ANTLR 解析器框架的桥梁
    【解决方案3】:

    你绝对可以看看simian
    据我所知,它或多或少只能与构建服务器一起使用。
    但是您也可以通过命令行执行它或将其集成到本地构建工具中,例如 ant .

    它有多个配置选项,例如“识别”重复项需要多少行等等。唯一不是最好的是恕我直言生成的输出(xml),但我认为这也是可配置的。

    希望这会有所帮助!


    编辑:PMD确实是一个很好的工具,不妨试试和simian一起使用。 PMD 也很好地支持将其作为插件集成到 IDE 或编辑器中。

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多