*

Eclipse(4.3,4.4)のJava言語のリファクタリング機能の使い方[リファクタリングの説明と「名前変更」と「移動」]

公開日: : 最終更新日:2016/12/05 Eclipse, Java


スポンサードリンク



本エントリーでは、Eclipse(4.3,4.4)の「リファクタリング」機能の使い方を説明させていただきます。
と言っても、「リファクタリング」機能を1エントリーで説明するのは無理ですので、複数エントリーとさせていただきます。

本エントリーの内容は以下の通りです。

  1. 「リファクタリング」とは
  2. Eclipseの「リファクタリング」機能の説明(「名前変更」と「移動」)


1 「リファクタリング」とは

プログラムの振る舞いを変えることなくソースコードを変更すること。

ソフトウェア開発では、コーディング作業が進むにつれて、コーディングや設計の考慮漏れ、設計変更等が発生し、ソースコードが徐々に汚くなっていく場合が多い。

また、一般的なソフトウェアは、一度作成したらそこで開発が終了するわけではなく、機能追加や既存機能にたいするバグ修正や仕様変更が行われることが多く、これらの作業によってもソースコードは汚くなり、可読性が落ちることが一般的であるといえます。

このようになったソースコードをきれいにする作業を「リファクタリング」とよびます。

「リファクタリング」を行う上で重要なポイントは、「リファクタリング」は「リファクタリング」単独で行うことです。
機能追加やバグ修正と同時に「リファクタリング」を行った場合、ソフトウェアに不具合が発生した箇所を特定することが困難になります。

「リファクタリング」関連のオススメ本

「リファクタリング」に関する書籍は多く出ていますので、一冊読むと全然違うコードが書けるようになります。
しかし、段々時間がたっていくと忘れる・・・
ので、一冊は自分で購入して、たまに読み返すことをオススメいたします。

気合いの入った方には「CODE COMPLETE 第2版 上」をオススメします。良書ですが、読み切るのに気合いが要ります。
[amazonjs asin=”489100455X” locale=”JP” title=”CODE COMPLETE 第2版 上”]
もっとライトな感じの本をお望みであれば、「リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック」
がオススメです。
[amazonjs asin=”4873115655″ locale=”JP” title=”リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)”]

Eclipes(4.3)に存在する「リファクタリング」

Eclipes(4.3)で行える「リファクタリング」は以下の画像の通りです。
詳細は「2 Eclipse(4.3)の「リファクタリング」機能の説明(「名前変更」と「移動」)」で説明させていただきます。
スクリーンショット 2014-06-27 12.18.50

2 Eclipse(4.3)の「リファクタリング」機能の説明(「名前変更」と「移動」)

Eclipseの「リファクタリング」機能を使えば、「リファクタリング」作業を省力化することが可能です。
以降では、Eclipseの「リファクタリング」機能の詳細な説明をさせていただきます。

基本的な「リファクタリング」

「名前変更」

クラス名や、変数名を変更します。

・クラス名変更の例
以下の様なHogeHogeクラスが存在しています。

このHogeクラスの名前を変更します。HogeHoge.javaをソースエディタに表示し、classの右にあるHogeHogeにフォーカスを当てた後
右クリックメニューの[リファクラリング]>[名前変更]をクリックします。
スクリーンショット 2014-06-27 19.14.44

ソースエディタが以下のように表示されるので、新しい名前(Hoge)を入力し「リターン」キーを叩きます。
スクリーンショット 2014-06-27 18.55.04

無事にクラス名が変更できました。パッケージ・エクスプローラのファイル名もHoge.javaに変わっています。

この例では、HogeHogeクラスを参照しているクラスが存在しなかったため、参照も変更されることを確認できませんでしたので
変数名の変更でこの確認をしたいと思います。

・クラスメンバの変数名の変更の例
今度は、Hogeクラスにインスタンスメンバ(intValue)が存在しており、HogeUserクラスがこのインスタンスメンバを参照している状態を作成した上で、
Hogeクラスのインスタンスメンバ(intValue)の名前を変更してみます。

Hogeクラス

HogeUserクラス

この状態からエディタでHogeクラスのintValueにフォーカスを当てます。
右クリックメニューの[リファクラリング]>[名前変更]をクリックします。
スクリーンショット 2014-06-27 19.11.28

変数名はnewIntValueに変更してみました。

予想通りですが、HogeUserで参照している名前も変更されました。

このように「リファクタリング」機能を利用して名前変更をすると、その名前を参照している全ての箇所も変更後の名前に自動的に変更されます。

「移動」

定数、変数、メソッド、クラスが移動可能です。

定数、変数、メソッドの移動は、他のクラスへの移動となり、
クラスの移動は、クラスが属するパッケージの移動となります。

「移動」の「リファクタリング」を検証するために、Hogeクラスに定数とメソッドを追加しました。

・定数の移動
CONST_INT_VALUEにフォーカスをあて、右クリックメニューの[リファクラリング]>[移動]をクリックします。
スクリーンショット 2014-06-27 19.45.24

すると以下の画面が表示されます。
スクリーンショット 2014-06-27 19.46.53

移動先は「foo.var.HogeUser」が表示されている場所に表示されます。

「移動されたメンバーへの委譲として元のメンバーを保持」チェックボックスは、値の設定自体は移動先クラスに移動するが
その値を参照した定数を移動元クラスに残すかどうかの設定です。

「非推奨としてマーク」チェックボックスは、「移動されたメンバーへの委譲として元のメンバーを保持」がチェックされた時のみ有効(指定可能)となり、チェックすると、非推奨なAPIを意味する@deprecatedアノテーションが移動元クラスの定数に付与されます。

ちょっと分かりにくいと思いますので、プレビューの結果画面で説明します。

パターン1 「移動されたメンバーへの委譲として元のメンバーを保持」チェックボックスはチェックしない時
スクリーンショット 2014-06-27 20.58.09

Hoge.javaのプレビュー
スクリーンショット 2014-06-27 20.53.45

HogeUser.javaのプレビュー
スクリーンショット 2014-06-27 20.55.26

この時は、普通にHoge.javaからHogeUser.javaに移動するだけです。

パターン2 「移動されたメンバーへの委譲として元のメンバーを保持」チェックボックスはチェックし、「非推奨としてマーク」チェックボックスはチェックしない
スクリーンショット 2014-06-27 20.59.45

Hoge.javaのプレビュー
スクリーンショット 2014-06-27 21.01.36

HogeUser.javaのプレビュー
スクリーンショット 2014-06-27 21.04.18

この時は、Hoge.javaにもHogeUser.javaにも対象の定数が存在しますが、Hoge.javaの定数の値はHogeUser.javaの定数の値を代入されているのでHogeUser.javaの値と異なる値になれません。
リファクタリング後に、HogeクラスのCONST_INT_VALUEを参照しているクラスでコンパイルエラーが発生しないようにするためには、「移動されたメンバーへの委譲として元のメンバーを保持」をチェックすることはとても有効な選択です。

パターン3 「移動されたメンバーへの委譲として元のメンバーを保持」チェックボックスはチェックし、「非推奨としてマーク」チェックボックスはチェックする。
スクリーンショット 2014-06-27 21.13.01

Hoge.javaのプレビュー
スクリーンショット 2014-06-27 21.14.03

HogeUser.javaのプレビュー
スクリーンショット 2014-06-27 21.15.24

パターン2との違いはHogeクラスの定義に
@deprecated {@link HogeUser#CONST_INT_VALUE} の代用
アノテーションが付与されているだけです。

パターン3の設定でリファクタリングを実際に行います。
するとHoge.javaのCONST_INT_VALUEに変化がありました。取り消し線のようなものがひかれています。
スクリーンショット 2014-06-27 21.20.43

HogeUser.javaからHoge.javaのCONST_INT_VALUEを参照する処理を追加してみました。
同じように取り消し線のようなものがひかれていますし、警告も出ています。
スクリーンショット 2014-06-27 21.25.18

警告は以下の通りです。
スクリーンショット 2014-06-27 21.26.59

移動先クラスの選択方法ですが、
現在の状態では移動先はHogeUserクラスしか存在しないので、移動先を他のクラスに変更することが不可能ですが
本来は移動先の候補をリストから選択、または「参照」ボタンをクリックし選択します。
スクリーンショット 2014-06-27 19.50.25

「参照」ボタンクリック時に表示される画面
スクリーンショット 2014-06-27 19.52.03

・変数の移動
HogeクラスのnewIntValueをHogeUesrクラスに移動します。
newIntValueにフォーカスをあて、右クリックメニューの[リファクラリング]>[移動]をクリックします。

すると以下の画面が表示されます。この時点では移動元クラスが選択されているので「OK」ボタンは非活性です。
スクリーンショット 2014-06-27 21.32.22

移動先のHogeUserクラスを選択すると「OK」ボタンが活性化します。
スクリーンショット 2014-06-27 21.34.36

「OK」ボタンをクリックすると移動が実行されます。
移動は正しく実行されたのですが、コンパイルエラーが発生してしまいました。
スクリーンショット 2014-06-27 21.39.22

エラーの詳細は以下の通りです。
newIntValue は解決できないか、フィールドではありません HogeUser.java /RefactoringSample/src/foo/var 行 8

「リファクタリング」の移動は、あくまでも変数を移動するだけで、参照しているクラスは変更してくれませんので注意が必要です。
これは定数の時も同じです。

・メソッドの移動
メソッドの移動の前にnewIntValue変数をHoge.javaに戻しました。

HogeクラスのdummyMethodメソッドを選択し右クリックメニューの[リファクラリング]>[移動]をクリックします。
スクリーンショット 2014-06-27 21.58.34

すると以下の画面が表示されます。
スクリーンショット 2014-06-27 22.00.03

と、ここまでは良かったのですが、この後HogeUesrクラスをどうやっても選択できません。
プロジェクトルートを選択すると「OK」ボタンは有効になるのですが、押すと大変なことになるので押せません。
この環境がJDT Beatだからかもしれません・・・
スクリーンショット 2014-06-27 22.04.49

・クラスの移動
クラスの移動は、クラスが属するパッケージを移動する処理となります。

HogeUserクラスのパッケージをfooに変更する「リファクタリング」を行ってみます。

HogeUserを開いたエディタでclass名のHogeUserにフォーカスを当て、右クリックメニューの[リファクラリング]>[移動]をクリックします。

すると以下の画面が表示されます。
スクリーンショット 2014-06-27 22.15.20

画面項目を先に説明させていただきます。

右上の「パッケージの作成」ボタンは移動先のパッケージが存在していない場合に、パッケージを先に作成する時に利用するボタンです。
「パッケージ作成」画面は以下の通りです。
スクリーンショット 2014-06-27 22.21.14

「’HogeUser.java’の宛先を選択」の下のエリアは、そのままですが移動先を選ぶエリアです。

「’HogeUser.java’の参照を更新」チェックボックスは、HogeUser.javaを参照しているクラスにおけるHogeUserクラスの参照先を移動元パッケージから移動先パッケージに自動的に更新するオプションです。
このチェックを外した状態で「リファクタリング」を行うとHogeUserクラスを参照しているクラスでコンパイルエラーが発生するようになります。

「非Javaテキスト・ファイル内の完全修飾子名の更新(プレビューを強制)」チェックボックスは.Javaファイル以外に記載されている移動対象クラス(完全修飾子名)を移動先の完全修飾子名に更新するオプションです。

foo.varからfooに移動する場合は、
foo.var.HogeUserとの記載が.Javaファイル以外の任意のファイルに存在した場合はfoo.HogeUserに更新されます。

画面項目の説明が長くなりましたが、宛先を選ぶエリアでfooを選択し「OK」ボタンをクリックします。
スクリーンショット 2014-06-27 22.17.06

無事にHogeUserクラスのパッケージがfooに変更され、パッケージ・エクスプローラーの表示場所も変更されています。
HogeクラスからのHogeUserの参照もfoo.HogeUseとなっています。
スクリーンショット 2014-06-27 22.43.59


スポンサードリンク



関連記事

Eclipseの「DBViewer」プラグインを利用して「Java DB」の環境を作成し、SQLを発行してみる

EclipseのJUnitプラグインとDBUnitを併用したDB(データベース)のアクセス処理のユニ

記事を読む

Eclipse4.4(Java)におけるビルド・パス関係の設定方法[ビルド・パス上のソース・フォルダー]

Eclipse4.4(Java)におけるビルド関係のビルド・パス上のソース・フォルダーの利用方法を説

記事を読む

Java8のラムダ式とStream APIを利用してコーディング量の削減サンプル集

Java8になりラムダ式と「Stream API」が利用できるようになりました。 C#では一足早く

記事を読む

Selenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]

Selenium3も3.0.1がリリースされましたし、今後は本格的にSelenium3が利用されてい

記事を読む

Java超入門 with Eclipse[2:プリミティブ型(基本データ型)とは]

他のプログラミング言語と同様に、Javaにもデータ型が存在します。 Java超入門の第2回では、プ

記事を読む

JUnit入門その1[Eclipse4.4のJUnitプラグインの基本的な使い方]

利用する環境の作成につきましては、「Eclipseの使い方(Windows環境のEclipse4.3

記事を読む

Eclipse4.4(Java)における自動ビルド設定の変更方法の説明

Eclipse4.4における自動ビルド設定の変更方法を説明させていただきます。 自動ビルド設定の変

記事を読む

java8(JDK8)の新機能[大幅に強化されたコレクションAPI:java.util.List] をeclipseとJUnitで確認する。

Java8(JDK8)では、ラムダ式の導入を前提とした、コレクションAPIの新機能が追加されました。

記事を読む

JUnit入門その5[DBUnitの概要説明]

前回エントリーでは「JUnit入門その4」と題してDBUnitをEclipseで動作させるための環境

記事を読む

Javaによる非同期処理入門その1[非同期処理の実装方法の概説]

Javaによる非同期処理に関するエントリーを前々から作成したいと思っていたのですが、ついに作成してみ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Selenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]

Selenium3も3.0.1がリリースされましたし、今後は本格的にS

Selenium利用時のトラブルシューティング方法[クリック編]

Seleniumは便利なテスト自動化ツールですし、今後は更なる利用者の

Java8のラムダ式とStream APIを利用してコーディング量の削減サンプル集

Java8になりラムダ式と「Stream API」が利用できるようにな

Selenium入門その5[ページオブジェクトパターン(Page Object Design Pattern)を利用して変更に強いテストを作成する方法]

Selenium入門その2 では「UIマップファイル」と言う仕組みが

Javaによる非同期処理入門その1[非同期処理の実装方法の概説]

Javaによる非同期処理に関するエントリーを前々から作成したいと思って

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑