复杂的重构

时间:2013-04-29 14:34:38

标签: java refactoring automated-refactoring

是否有任何优秀的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();
  }
}

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

3 个答案:

答案 0 :(得分:2)

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

最后,弄清楚所需的行动链很难;你不想手工做这件事并弄错。您需要能够机械地应用更改并在生产应用程序尝试之前验证多次试验的结果。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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