10

編集:このリファクタリングの Eclipse 拡張要求を送信しました。

プライベート フィールドをあるクラスからそのヘルパー クラスに移動する方法はありますか? 以下のチキンスクラッチ UML は、私が現在手動で行っていることを示しています。クラスには、リファクタリング前のオブジェクト へのC1非公開fieldおよび非公開の最終参照があります。Helper

リファクタリング後、C1'toのすべての参照は必要に応じてandfieldに変更されます。helper.getField()helper.setfield()

UML ダイアグラム

class Field {}

class C1 {
   final private Field field;
   final private Helper helper;

   public Field getField() {
      return field;
   }

   public C1() {
      helper = new Helper();
      field = new Field();
   }
}

class Helper {}

class C1Prime {
   final private HelperPrime helper;

   public Field getField() {
      return helper.getField();
   }

   public C1Prime() {
      helper = new HelperPrime();
   }
}

class HelperPrime {
   final private Field field;
   public HelperPrime() {
      field = new Field();
   }
   public Field getField() {
      return field;
   }
}

私は Eclipse のリファクタリング機能をかなり使ってきましたが、これを自動化する方法がわかりません。

たとえば、理想的には、プライベート フィールド/属性/メンバーをあるクラスから別のクラスにドラッグし、未解決の参照をどのように処理したいか Eclipse から尋ねられることを期待します。それは提案を提供せず、すべての参照を壊します。

私が繰り返してきた操作は、現在のクラスに実際には属していない知識と行動を分離することです。特定のフィールドを参照する属性と動作を元のクラスから新しい「ヘルパー」クラスに移動しています。

私のリファクタリングの最初のステップは、フィールドを移動することです。ヘルパー クラスへの参照は、リファクタリング元のクラスのフィールドとして存在します。リファクタリング中に壊れないようにするため に、Eclipse が getter と setter を生成し、参照を更新して新しいクラスで getter/setter を使用することC1を提案してくれたらいいと思います。Helper'C1

4

6 に答える 6

8

まあ、これが一般的に機能するのは意味がありません。意味的には、奇妙な操作です。フィールドを新しいばらばらなクラス (たとえば、String から Integer へ) に移動すると、それを参照したコードには、インスタンス フィールドを取得するために使用する新しいクラスのインスタンスがありません。

したがって、フィールドが静的メンバーである場合、またはフィールドを親クラスに移動する場合など、特別な場合にのみ意味があります。

static membersの場合、移動するフィールド (変数名) を右クリックし、[リファクタリング] -> [移動] をクリックすると問題なく動作します。新しいタイプを選択します。参照は自動的に更新されます (自分で試してみてください)

親クラスとの間で移動する場合は、Refactor->Pull Up または Push Down を使用できますが、これによって参照が自動的に変更されることはありません (Push Down のみの問題です。Pull Up ポリモーフィズムでは、参照はすべて問題ありません)。

于 2010-10-04T20:58:59.367 に答える
2

問題は、あなたのフィールドはプライベートでなければならないということです(私は、パブリックの非最終フィールドを作成する機能が存在する理由さえ知りません)。では、どうすれば別のクラスからアクセスできるのでしょうか?

リファクタリング中にそれを壊したくない場合は、ちょっと役立つちょっとしたトリックを教えてあげましょう。

クラスを作成するときは、既存のクラスの内部クラスにするか、同じファイル内の 2 番目のクラスにします。

内部クラスにすると、最初にメソッドをコピーでき、他のクラスのメンバーを参照できます。すべての機能を移植したら、変数を移動できます。この時点で、変数への参照を更新する必要はありません。これは、変数がどのクラスにあるかに関係なく、同じ方法で変数にアクセスするためです。

クラスを同じファイル内の 2 番目のクラスにすることは、機能を分割する場合にも便利です。これにより、ウィンドウ間でマウスを移動しなくても一度にすべてにアクセスできます。完了したら、新しいクラスを独自の Java ファイルにドラッグし、インポートを再計算し、再フォーマットして公開し、保存します。

既存のクラスと対話する新しいクラスを作成するときは、ほとんどの場合、これらの方法論のいずれかを使用します。

于 2010-10-04T21:15:32.733 に答える
1

しませright click the field > Refactoring > Moveんか?

はい、参照を更新しませんが、何をしなければならないか想像してみてください。フィールドが参照されているすべての場所で、新しいクラスをインスタンス化する必要があります。それは実用的ではありません。

于 2010-10-04T20:46:45.500 に答える
1

フィールドでの移動操作が適切に機能しません。フィールドを移動できますが、Eclipse はゲッターとセッターを移動しません。これが可能かどうかは興味深い質問ですが、そうではないと思います。

于 2010-10-04T20:49:09.200 に答える
0

ターゲット クラスがまだ存在しない場合は、Refactor > Extract Class. これにより、選択したフィールドを含む新しいクラスが作成され、このタイプのフィールドが元のクラスに追加されます。

存在するクラスに対してそれができるかどうかはわかりませんが、いつでもクラスの抽出を使用して、その内容を新しいクラスにカットアンドペーストできます。

于 2010-10-04T20:53:52.987 に答える
0

Java 関数の場合は、その名前を右クリックして を選択するだけRefactor > Moveです。ウィザードで、このメソッドを管理する新しいクラスを選択します。

移動する必要がある複数の要素を一度に選択できない場合でも、これはタスクに役立つと思います...

于 2010-10-04T20:46:24.450 に答える