复杂重构

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个回答

2
大规模的重构通常包括自定义转换,例如对代码的更改不易表达为经典重构操作的组合。如果可以这样做,使用交互式工具很困难;实质上,您需要通过数百个更改来操作鼠标,并且您本身不可靠,无法进行可重复的过程。
最后,找出所需的操作链是困难的;您不想手动完成此操作并出错。在尝试生产应用之前,您需要有能力机械地应用这些更改并在多次试验中验证结果。
您最好使用可编程重构工具。对于大规模的更改,您可能需要考虑使用程序转换工具。这些工具允许您编写程序转换作为模式定向重写规则,例如:“如果您看到此代码,请用那个代码替换它”;通常这些重写也允许模式变量。这不是字符串替换;而是匹配程序结构(例如解析树),并且在更复杂的系统中可以包括有关符号类型以及信息来自何处或去往何处(数据流)的信息。因为它们匹配程序结构并且可以使用深层语义分析,所以它们可以进行可靠的更改。在过去20年中,程序转换工具已被用于对代码库进行大规模的更改。(如果您想了解我认为通常能够处理复杂重构任务的特定程序转换工具,请查看我的简介)。
您会听到“基于模型”的转换。通常这意味着“将您的代码转换为UML类模型,然后进行转换”。这种方法通常会失去代码本身的细节,这就是为什么基于代码操作的程序转换方法在进行大规模更改时更成功的原因。

1

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


1

0

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

要掌握所有这些需要付出一定的努力。但是,根据我的经验,如果您遇到困难,您可以在 Eclipse 论坛上获得快速支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接