首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂重构

复杂重构
EN

Stack Overflow用户
提问于 2013-04-29 22:34:38
回答 4查看 594关注 0票数 3

有没有好的Java重构工具可以处理像下面这样的大规模重构项目。显然,如果可能的话,我更喜欢免费的。

我正在处理一个遗留项目,其中大部分是在Java早期构建的。有许多甚至上百个类使用旧风格的命令处理模式,例如:

代码语言:javascript
复制
public interface IFrom {
  public static final String COMMAND1 = "Command1";
  public static final String COMMAND2 = "Command2";
}

public class From {
  public void doSomething(String command) {
    if (command.equals(IFrom.COMMAND1)) {
      doSomething1();
    } else if (command.equals(IFrom.COMMAND2)) {
      doSomething2();
    }
  }

  private void doSomething1() {
    System.out.println("Something-1");
  }

  private void doSomething2() {
    System.out.println("Something-2");
  }
}

变成更易于管理的东西,比如:

代码语言:javascript
复制
interface DoSomething {
  public void doSomething();
}

enum ToCommands implements DoSomething {
  Command1 {
    @Override
    public void doSomething() {
      System.out.println("Something-1");
    }
  },
  Command2 {
    @Override
    public void doSomething() {
      System.out.println("Something-2");
    }
  };
}

public class To {
  public void doSomething(String command) {
    ToCommands.valueOf(command).doSomething();
  }
}

我要补充的是,不仅可能有数百个类遵循此模式,而且其中一些类还实现了数百个命令。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-29 23:21:43

大规模重构通常包括自定义转换,例如,对代码的更改,这些代码不容易表达为经典重构操作的组合。如果是这样的话,使用交互式工具就很难做到这一点;从本质上讲,您需要在数百个更改中使用鼠标,并且作为一个可重复的过程,您是不可靠的。

最后,找出所需的操作链是很困难的;您不希望手动完成此操作,并将其弄错。在尝试生产应用程序之前,您需要能够机械地应用更改并验证多次试验的结果。

您很可能希望使用可编程的重构工具。对于大规模的更改,您可能需要考虑使用 program transformation tools。这样的工具允许您将程序转换编写为模式导向的重写规则,例如,“如果您看到此代码,请将其替换为该代码”;通常,这样的重写也允许模式变量。这些不是字符串替换;相反,它们与程序结构(例如,解析树)相匹配,并且可以使用更复杂的系统包括关于符号类型以及信息来自或去往何处(数据流)的信息。因为它们与程序结构相匹配,并且可以使用深度语义分析,所以它们可以做出可靠的更改。在过去的20年里,程序转换工具已经被用来对代码库进行大规模的更改。(如果你想看到一个我认为通常能够处理复杂重构任务的特定程序转换工具,请参阅我的简历)。

您将听到“基于模型的”转换。通常这意味着“将您的代码转换为UML类模型,然后转换它们”。这种方法通常会丢失代码本身的细节,这就是为什么在代码上操作的程序转换方法在大规模更改时更成功的原因。

票数 2
EN

Stack Overflow用户

发布于 2013-04-29 22:39:40

IntelliJ有提取接口,/superclass等,这将是最适合你。欲了解更多信息,请访问http://www.jetbrains.com/idea/features/refactoring.html。我使用商业许可,但我猜重构也是社区版的一部分。

(要编写重构程序,可以从eclipse JDT工具开始。我从未大规模使用过它)

票数 1
EN

Stack Overflow用户

发布于 2015-11-24 09:04:28

IntelliJ和JetBrains生产的其他类似的重构工具(例如Visual Studio的ReSharper插件)有一个名为Structural Search And Replace的功能,虽然鲜为人知,但却非常强大,对于这类更改非常有用。你基本上可以说:“每当你看到这样的代码结构,改变它,使它看起来像这样。”这与文本搜索和替换的不同之处在于,它实际上是通过查看程序结构和解析树来进行搜索和替换。您可以保留此类转换的列表,并根据自己的喜好调用它们。我发现这在转换旧代码时非常有用。

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

https://stackoverflow.com/questions/16281350

复制
相关文章

相似问题

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