4

これは、 のほとんどの属性に対して、 に対応する属性があり、そのロジックは への委譲に過ぎないことWを意味します。この状況は、以下に示すスケッチで最も正確に表すことができます。CCAWCA

class W {
    private C c;

    getX() { return c.getX(); }
    getY() { return c.getY(); }
}

問題は、私が を取り除きたくないと決めたことです。私は、すべての呼び出しコードをdo aまたは代わりに create aにgetX()する一時的なステップとして public にすることを好みます。すべての呼び出しがあり、それを通過します。C cWw.c.getX()w.c.getY()W.getC()getX()getY()

要するに、「カプセル化を解除する」リファクタリングです。Eclipse または Intellij のいずれかで、この非常に必要なタスクを実行するものはありますか?

4

2 に答える 2

6

IntelliJ では、 Remove Middlemanリファクタリング を使用できます。

検討:

:

public class W {
    private C c;

    Object getX() { return c.getX(); }
    Object getY() { return c.getY(); }
}

public class C {
    private Object x;
    private Object y;

    public Object getX() {
        return x;
    }

    public Object getY() {
        return y;
    }
}

public class UsesW {
    W w;
    public void useW() {
        Object x = w.getX();
        Object y = w.getY();
    }
}

の宣言にカーソルを置きますW.c。次に、[リファクタリング] | [リファクタリング]を選択します。仲介者を削除します。結果は、あなたがなりたい場所への途中であなたを取得します:

:

public class W {
    private C c;

    public C getC() {
        return c;
    }
}

/* class C is unchanged */

public class UsesW {
    W w;
    public void useW() {
        Object x = w.getC().getX();
        Object y = w.getC().getY();
    }
}

C次に、 in型の変数を導入できますUsesW。への呼び出しの 1 つにカーソルを置き、w.getC()インライン化します。Inline... (Ctrl-Alt-Nがデフォルトのショートカット)、すべてのインスタンスをインライン化することを選択します。それはあなたにこれを残します:

public class UsesW {
    W w;
    public void useW() {
        final C c = w.getC();
        Object x = c.getX();
        Object y = c.getY();
    }
}

最後に、完全に取り除くWことは、おそらく私よりもうまく答えることができるものですが、今ではその作業が大幅に簡単になりました.

于 2012-12-13T00:38:17.380 に答える
3
  1. getC()新しいメソッドを書きます。
  2. と書き換えgetX()ますreturn getC().getX()
  3. インラインgetX()

についても同様ですy

于 2012-12-13T00:26:31.873 に答える