是否有搜索代码和建议使用重复代码提取方法候选人的工具?下面是一个精心设计的例子:
import java.util.List;
public class ExtractMethod {
  public boolean mode;
  public String getFirst(List<String> one, List<String> two) {
    if(mode) {
      StringBuilder sb = new StringBuilder();
      for(String elements : one) {
        sb.append(elements.charAt(0));
      }
      return sb.toString();
    } else {
      StringBuilder sb = new StringBuilder();
      for(String elements : two) {
        sb.append(elements.charAt(0));
      }
      return sb.toString();
    }
  }
}如果您选择Eclipse中重复的行,并选择提取方法,您将得到如下结果:
import java.util.List;
public class ExtractMethod {
  public boolean mode;
  public String getFirst(List<String> one, List<String> two) {
    if(mode) {
      return getFirstFromList(one);
    } else {
      return getFirstFromList(two);
    }
  }
  private String getFirstFromList(List<String> one) {
    StringBuilder sb = new StringBuilder();
    for(String elements : one) {
      sb.append(elements.charAt(0));
    }
    return sb.toString();
  }
}挺不错的。是否有一种工具可以在课堂上查看,并对好的应聘者提出建议?
发布于 2014-05-01 15:47:36
流行的免费开源PMD代码分析器有一个拷贝粘贴检测器CPD -它可以找到类似的代码片段,这是很好的“提取方法”重构。它是跨平台的,可以在任何有JRE实现的系统中运行.它还为流行的构建工具和IDE(如maven、eclipse、ant等)提供了各种各样的插件。
发布于 2015-06-02 02:12:06
我们的CloneDR工具将这样做,在数千个文件中检测克隆。除了文件之外,您不会给它任何东西;它会自动确定克隆。
克隆集是一组被认为相似的代码块。通常克隆集只是对,有时是数千行,这发生在源代码库中大量复制源文件时。值得注意的是,克隆集可能有3,100,最多几百个类似代码的实例;通常后一种情况下的单个克隆是4-10行,代表代码库中到处使用的一些成语(例如字符串到数字转换例程)。
在它在包含Eclipse版本的超过1MSLOC代码中找到的将近10,000个克隆集中,它将找到这两个克隆:
    this.declaringQualification = isCaseSensitive() ? declaringQualification:  CharOperation.toLowerCase(declaringQualification);
    this.declaringSimpleName = isCaseSensitive() ? declaringSimpleName:  CharOperation.toLowerCase(declaringSimpleName);
    this.typeQualification = isCaseSensitive() ? typeQualification:  CharOperation.toLowerCase(typeQualification);和
    this.declaringQualification = isCaseSensitive() ? declaringQualification:  CharOperation.toLowerCase(declaringQualification);
    this.declaringSimpleName = isCaseSensitive() ? declaringSimpleName:  CharOperation.toLowerCase(declaringSimpleName);
    this.returnQualification = isCaseSensitive() ? returnQualification:  CharOperation.toLowerCase(returnQualification);并建议这种参数化抽象(不是完全是一种方法,但非常接近):
this.declaringQualification = isCaseSensitive() ? declaringQualification: CharOperation.toLowerCase(declaringQualification);
this.declaringSimpleName = isCaseSensitive() ? declaringSimpleName: CharOperation.toLowerCase(declaringSimpleName);
this. [[#variable5a6b82a0]]= isCaseSensitive() ? [[#variable5a6b82a0]]: CharOperation.toLowerCase( [[#variable5a6b82a0]]);注意,它决定代码只有一个参数,而不是两个参数。
它将找到更大的表达式,甚至是语句作为参数;在后一种情况下,它实际上意味着您需要一个lambda作为参数。
您可以控制克隆的大小、允许多少参数以及代码块必须被视为克隆的相似程度。在OP在一个文件中设计的示例中,如果设置正确,它应该以一个参数作为克隆来检测内部块。(在实践中,没有人有这么小的例子。)
(该网站有许多语言的例子)。
https://softwarerecs.stackexchange.com/questions/3742
复制相似问题