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 および JetBrains によって生成された他の同様のリファクタリング ツール (例: Visual Studio の ReSharper プラグイン) には、この種の変更に非常に役立つStructural Search And Replaceと呼ばれるあまり知られていないが非常に強力な機能があります。基本的には、「このように構造化されたコードを目にするときはいつでも、そのように見えるように変更してください」と言うことができます。これは、実際にプログラム構造と解析ツリーを調べて検索と置換を行うという点で、テキストの検索と置換とは異なります。このような変換のリストを保持し、好きなように呼び出すことができます。これは、古いコードを変換するときに非常に便利です。

于 2015-11-24T01:04:28.060 に答える
0

Eclipse MoDiscoプロジェクトは、そのようなリファクタリングを目指しています。Java プロジェクトをEMFモデル インスタンスに変換するのに役立ちます。次に、これらのモデルを操作できます(たとえば、言及したリファクタリングを適用します)。そのタスクを支援するためのツールもあります。たとえば、ATLです。その後、コード ジェネレーター ( XpandAcceleoJET ) を使用して、EMF モデル インスタンスを Java ソースに戻すことができます。

これらすべてに入るには、ある程度の努力が必要です。しかし、私の経験によると、行き詰まった場合は、Eclipse フォーラムで迅速なサポートを受けることができます。

于 2013-04-29T14:44:58.037 に答える