Skip to content.

Sections
Personal tools
You are here: Home » 技術文書 » リファクタリング » リファクタリングとツール

Document Actions
リファクタリングとツール

(株)永和システムマネジメント    梅田 政利
作成日:初出:ソフトバンク『C MAGAZINE 2003/6』

ここでは、リファクタリングツールの紹介として、 オープンソースのJava統合開発環境eclipse を紹介します。 このツールは、統合開発環境としてすごく良くできていることに加え、 リファクタリングまでサポートしてくれます。 機械的に判定するにはまだまだ制約のある状況も多いですが、 名前の変更やフィールドの引き上げなど、人為的なミスを引き起こさずにすばやく処理できるのは、やはりツールの強みでしょう。

   

画面はeclipse上でJUnitでのテストを実行しているところで、 リファクタリング後、すぐにテストできるのもうれしい点です。
それでは、サポートされるリファクタリングの一部について紹介しましょう。


拡大できます


Pull Up

フィールド、メソッドをスーパークラスに引き上げることができます。 リファクタリング例で、LineCreaterクラスとRectCreaterクラスから、 panelフィールドを引き上げたシーンを思い出してください。 面倒なステップを実行しましたよね。
LineCreaterクラスのpanelフィールドを選択し、[Refactor]-[Pull Up]を実行すると、 ダイアログが開いて変更内容を確認することができます。"Changes to be performed"で、 リファクタリング対象を選択すると、ダイアログの下半分左側に、 リファクタリング前のコードが表示されます。右側にはどのように変更されるかが表示され、一目瞭然です。 確認したらOKボタンを押しましょう。 RectCreaterクラスの変更内容を見てみます。引き上げに指定したのはLineCreaterクラスの panelフィールドですが、RectCreaterクラスでも正しく削除されるのが見て取れます。


拡大できます


スーパークラスであるCreaterクラスでは、 引き上げられたpanelフィールドが追加されていることが見て取れます。 privateだったフィールドが、protectedになっています。当たり前ですが、使っていてやっぱり便利です。


拡大できます


Self Encapsulate

フィールドをカプセル化できます。カプセル化したいフィールドを選択して、 [Refactor]-[Self Encapsulate]と選択すると、図のようなダイアログがでます。 setter/getterを作成するだけでなく、メソッドを挿入する位置まで指定することができます。 さらに、クラス中でのフィールドへのアクセスを作成したメソッドに置き換えることも可能です。


------------------------------------------

[変更前]

    public void create(Point point) {

      …

        store.removeRubberEntity(line);

      …

    }

------------------------------------------

[変更後]

    public void create(Point point) {

      …

        store.removeRubberEntity(getLine());

      …

    }



    private void setLine(Line2D line) {

        this.line = line;

    }



    private Line2D getLine() {

        return line;

    }

------------------------------------------

Rename

クラス名、フィールド名、メソッド名、変数名を変更できます。カプセル化の例で用いたフィ ールドlineをshapeに変更します。lineフィールドを選択し、[Refactor]-[Rename]と選択 すると、図のようなダイアログがでます。チェックボックスで指定すると、setter/getter の名前も変更(指定した名前によって自動的に命名されます)することができます。これも とても便利ですが、引数名までは変更されなかったので少し残念です。



------------------------------------------

[変更前]

    private Line2D line;



    private void setLine(Line2D line) {

        this.line = line;

    }



    private Line2D getLine() {

        return line;

    }

------------------------------------------

[変更後]

    private Line2D shape;



    private void setShape(Line2D line) {

        this.shape = line;

    }



    private Line2D getShape() {

        return shape;

    }

------------------------------------------

Extract Method

メソッドを抽出できます。 抽出したい部分を選択し、[Refactor]-[Extract Method]と選択すると、 図のようなダイアログがでます。ここで、メソッド名と可視性を指定します。 また、引数が自動的に付加されますが、名称等を編集することが可能です。 「リファクタリングしてみよう」の例とは少し異なりますが、 "resetRectangle((Rectangle)rubber, point);"の1行を抽出しています。

------------------------------------------

[変更前]

    public void aid(Point point) {

        resetRectangle((Rectangle)rubber, point);

        if (panel != null) panel.repaint();

    }

------------------------------------------

[変更後]

    public void aid(Point point) {

        resetShape(point);

        if (panel != null) panel.repaint();

    }

    protected void resetShape(Point point) {

        resetRectangle((Rectangle)rubber, point);

    }

------------------------------------------




この記事への評価にご協力をお願いします。

良かった 普通 イマイチ