【问题标题】:How to find a similar code fragment?如何找到类似的代码片段?
【发布时间】:2010-10-17 02:55:02
【问题描述】:

有没有人有一些工具或一些推荐的做法如何找到一段与其他代码相似的代码?

我经常写一个函数或一个代码片段,我记得我之前已经写过类似的东西,我想重用以前的实现,但是使用纯文本搜索不会显示任何内容,因为我没有使用变量名称完全相同。

拥有相似的代码片段会导致不必要的代码重复,但是对于大型代码库,不可能将所有代码都保存在内存中。是否有任何工具可以对代码和标记的片段或功能进行一些分析?

考虑以下示例:

  float xDistance = 0, zDistance = 0;
  if (camPos.X()<xgMin) xDistance = xgMin-camPos.X();
  if (camPos.X()>xgMax) xDistance = camPos.X()-xgMax;
  if (camPos.Z()<zgMin) zDistance = zgMin-camPos.Z();
  if (camPos.Z()>zgMax) zDistance = camPos.Z()-zgMax;
  float dist = sqrt(xDistance*xDistance+zDistance*zDistance);

  float distX = 0, distZ = 0;
  if (cPos.X()<xgMin) distX = xgMin-cPos.X();
  if (cPos.X()>xgMax) distX = cPos.X()-xgMax;
  if (cPos.Z()<zgMin) distZ = zgMin-cPos.Z();
  if (cPos.Z()>zgMax) distZ = cPos.Z()-zgMax;
  float dist = sqrt(distX*distX +distZ*distZ);

在我看来,这已经被问过好几次了:

https://stackoverflow.com/questions/204177/what-tool-to-find-code-duplicates-in-c-projects

How to detect code duplication during development?

我建议在这里关闭为重复。


其实我认为这是一个更一般的搜索问题,比如:如果问题已经在 StackOverflow 上被问过,我该如何搜索?

【问题讨论】:

标签: language-agnostic search maintenance code-duplication


【解决方案1】:

您可以使用Simian。它是一种检测 Java、C#、C++、XML 等(甚至是纯 txt 文件)中重复代码的工具。它甚至可以很好地集成到 CruiseControl 等工具中。

【讨论】:

    【解决方案2】:

    我们的CloneDR 在大型源系统中查找重复代码,包括精确副本和接近未命中,并由语言语法参数化。支持Java、C#、COBOL、C++、PHP、Python等多种语言。

    它接受许多参数来定义“什么是克隆?”,包括: a) 相似度阈值,控制两个代码块的相似程度 被宣布为克隆(通常 95% 是好的) b) 最小克隆大小的行数(3 往往是一个不错的选择) c) 参数数量(文本的明显变化;5 往往是一个不错的选择) 使用这些设置,它往往会在虚拟环境中找到 10-15% 的冗余代码 它处理的一切。

    Simian 等面向行的克隆检测工具无法找到克隆代码 已重新格式化,但 CloneDR 会。他们可能会说两个代码块匹配, 但它们通常不会向您确切显示它们的匹配方式或差异所在; CloneDR 会。他们没有建议如何抽象克隆代码; CloneDR 会。

    由于匹配较弱 算法,它们往往会产生更多的误报;当您报告 5000 个克隆时 跨越一百万行,误报的数量非常重要。

    根据您的示例,我希望它能够找到这两个片段 (你没有指向任何一个)并注意他们 如果你抽象出变量名,它们是相似的。

    【讨论】:

      【解决方案3】:

      这是我见过的关于代码克隆检测的最佳集合:

      https://web.archive.org/web/20120502162147/http://students.cis.uab.edu/tairasr/clones/literature

      有很多程序,但似乎没有一个是最好的或最受欢迎的。您可以思考什么对您来说最重要,然后找到适合您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-05
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 2021-12-05
        相关资源
        最近更新 更多