首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提取方法推荐工具

提取方法推荐工具
EN

Software Recommendation用户
提问于 2014-04-30 15:03:12
回答 2查看 88关注 0票数 8

是否有搜索代码和建议使用重复代码提取方法候选人的工具?下面是一个精心设计的例子:

代码语言:javascript
运行
复制
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中重复的行,并选择提取方法,您将得到如下结果:

代码语言:javascript
运行
复制
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();
  }
}

挺不错的。是否有一种工具可以在课堂上查看,并对好的应聘者提出建议?

EN

回答 2

Software Recommendation用户

发布于 2014-05-01 15:47:36

流行的免费开源PMD代码分析器有一个拷贝粘贴检测器CPD -它可以找到类似的代码片段,这是很好的“提取方法”重构。它是跨平台的,可以在任何有JRE实现的系统中运行.它还为流行的构建工具和IDE(如maven、eclipse、ant等)提供了各种各样的插件。

票数 3
EN

Software Recommendation用户

发布于 2015-06-02 02:12:06

我们的CloneDR工具将这样做,在数千个文件中检测克隆。除了文件之外,您不会给它任何东西;它会自动确定克隆。

克隆集是一组被认为相似的代码块。通常克隆集只是对,有时是数千行,这发生在源代码库中大量复制源文件时。值得注意的是,克隆集可能有3,100,最多几百个类似代码的实例;通常后一种情况下的单个克隆是4-10行,代表代码库中到处使用的一些成语(例如字符串到数字转换例程)。

在它在包含Eclipse版本的超过1MSLOC代码中找到的将近10,000个克隆集中,它将找到这两个克隆:

代码语言:javascript
运行
复制
    this.declaringQualification = isCaseSensitive() ? declaringQualification:  CharOperation.toLowerCase(declaringQualification);
    this.declaringSimpleName = isCaseSensitive() ? declaringSimpleName:  CharOperation.toLowerCase(declaringSimpleName);
    this.typeQualification = isCaseSensitive() ? typeQualification:  CharOperation.toLowerCase(typeQualification);

代码语言:javascript
运行
复制
    this.declaringQualification = isCaseSensitive() ? declaringQualification:  CharOperation.toLowerCase(declaringQualification);
    this.declaringSimpleName = isCaseSensitive() ? declaringSimpleName:  CharOperation.toLowerCase(declaringSimpleName);
    this.returnQualification = isCaseSensitive() ? returnQualification:  CharOperation.toLowerCase(returnQualification);

并建议这种参数化抽象(不是完全是一种方法,但非常接近):

代码语言:javascript
运行
复制
this.declaringQualification = isCaseSensitive() ? declaringQualification: CharOperation.toLowerCase(declaringQualification);
this.declaringSimpleName = isCaseSensitive() ? declaringSimpleName: CharOperation.toLowerCase(declaringSimpleName);
this. [[#variable5a6b82a0]]= isCaseSensitive() ? [[#variable5a6b82a0]]: CharOperation.toLowerCase( [[#variable5a6b82a0]]);

注意,它决定代码只有一个参数,而不是两个参数。

它将找到更大的表达式,甚至是语句作为参数;在后一种情况下,它实际上意味着您需要一个lambda作为参数。

您可以控制克隆的大小、允许多少参数以及代码块必须被视为克隆的相似程度。在OP在一个文件中设计的示例中,如果设置正确,它应该以一个参数作为克隆来检测内部块。(在实践中,没有人有这么小的例子。)

(该网站有许多语言的例子)。

票数 1
EN
页面原文内容由Software Recommendation提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwarerecs.stackexchange.com/questions/3742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档