3

是否有任何好的 Java 重构工具可以处理大型重构项目,例如下面的一个。显然,如果可能的话,我更喜欢免费的。

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

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");
  }
}

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

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();
  }
}

我可能会补充一点,不仅可能有数百个类遵循这种模式,而且其中一些实现了数百个命令。

4

4 回答 4

2

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

最后,弄清楚所需的行动链很困难。您不想手动执行此操作并弄错。在尝试生产应用程序之前,您需要能够机械地应用更改并通过多次试验验证结果。

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

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

于 2013-04-29T15:21:43.063 回答
1

IntelliJ 具有提取接口/超类等。这将最适合您。在http://www.jetbrains.com/idea/features/refactoring.html上查看更多信息。我使用商业许可证,但我猜重构也是社区版的一部分。

(编写重构程序,可以从eclipse JDT工具入手。我从没大规模使用过)

于 2013-04-29T14:39:40.293 回答
1

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

于 2015-11-24T01:04:28.060 回答
0

Eclipse MoDisco项目旨在进行此类重构。它可以帮助您将 Java 项目转换为EMF模型实例。然后你可以操纵这些模型(例如应用你提到的重构)。还有一些工具可以帮助您完成该任务 -例如ATL 。然后,您可以使用代码生成器(XpandAcceleoJET)将 EMF 模型实例转换回 Java 源代码。

进入这一切需要付出一些努力。但就我的经验而言,如果您可能遇到困难,您可以在 eclipse 论坛上获得快速支持。

于 2013-04-29T14:44:58.037 回答