【问题标题】:Eliminating code duplication in a single file消除单个文件中的代码重复
【发布时间】:2011-01-12 00:28:23
【问题描述】:

遗憾的是,我最近从事的一个项目有大量的复制粘贴代码,即使在单个文件中也是如此。是否有任何工具或技术可以检测单个文件中的重复或接近重复?我有 Beyond Compare 3,它可以很好地比较单独的文件,但我无法比较单个文件。

提前致谢。

编辑:

感谢所有出色的工具!我一定会去看看的。

这个项目是一个 ASP.NET/C# 项目,但我使用多种语言,包括 Java;我对哪些工具最适合(任何语言)删除重复感兴趣。

【问题讨论】:

  • 不同语言的解决方案完全不同。为 ASP.NET/C# 标记。
  • 正确,但我想知道最流行语言的最佳工具(因为我一次使用多种语言)。不过还是谢谢。
  • CloneDR 解决方案对于许多语言相同。 CloneDR 处理 C#、Java、HTML 和 JavaScript,我认为它们很好地涵盖了 OP 的“ASP.NET”情况。
  • 其他要查找的关键字:复制粘贴检测、相似性识别。你可以试试pmd

标签: refactoring code-duplication


【解决方案1】:

如果您使用的是 Eclipse,则可以使用复制粘贴检测器 (CPD) https://olex.openlogic.com/packages/cpd

【讨论】:

    【解决方案2】:

    Resharper 会自动执行此操作 - 它会建议何时将代码提取到方法中,并会为您执行提取操作

    【讨论】:

      【解决方案3】:

      查看Atomiq。它会找到重复的代码,这些代码是提取到一个位置的主要代码。

      http://www.getatomiq.com/

      【讨论】:

      【解决方案4】:

      查看 PMD ,一旦你配置了它(这有点简单),你可以运行它的 copy paste detector 来查找重复的代码。

      【讨论】:

        【解决方案5】:

        请参阅SD CloneDR,这是一种用于检测多个文件内和跨多个文件的复制粘贴编辑代码的工具。它可以检测精确的副本、已重新格式化的副本以及具有不同标识符、文字甚至不同语句序列的未命中副本。

        CloneDR 可处理多种语言,包括 Java(1.4、1.5、1.6)和 C#,尤其是 C#4.0。您可以在网站上查看示例克隆检测报告,其中还包括一份针对 C# 的报告。

        【讨论】:

          【解决方案6】:

          你没有说你使用的是什么语言,这会影响你可以使用什么工具。

          对于 Python,有 CloneDigger。它也支持Java,但我没有尝试过。它可以找到单个文件和文件之间的代码重复,并以 HTML 格式的类似差异报告的形式为您提供结果。

          【讨论】:

            【解决方案7】:

            具有一定办公技能的人可以在 1 分钟内完成以下序列:

            • 使用普通格式化程序统一代码风格,最好不要换行
            • 将代码文本作为单列输入 Microsoft Excel
            • 搜索并用单个空格替换所有双空格并进行其他替换
            • 对列进行排序

            此时已经可以很好地检测到重复的关键字。但要走得更远

            • 将比较器公式添加到第 2 列,将计数器添加到第 3 列
            • 再次复制和粘贴值,排序并查看重复次数最多的行

            【讨论】:

              【解决方案8】:

              有一个分析工具,叫Simian,我还没试过。据说它可以在任何类型的文本上运行并指出重复的项目。它可以通过命令行界面使用。

              【讨论】:

              • 链接已损坏。
              【解决方案9】:

              另一个与上述类似的选项,但使用不同的工具链:https://www.npmjs.com/package/jscpd

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-07-05
                • 1970-01-01
                • 2018-08-25
                • 1970-01-01
                • 1970-01-01
                • 2011-04-02
                • 2013-01-30
                • 1970-01-01
                相关资源
                最近更新 更多