"またあったね。"

"やあ!"

「今日はリファクタリングについて説明します。リファクタリングとは、機能を変更せずにプロジェクト内のコードを変更することです。」

「しかし、どうしてそんなことが可能なのでしょうか?」

「そうですね、最も単純なケースでは、変数やメソッドの名前を変更できます。結局のところ、変数の名前を変更してもプログラムの動作が変わるわけではありませんね?」

"もちろん違います。"

大きなメソッドをいくつかの小さなメソッドに分割することもできます。

"繰り返されるコード スニペットを別のメソッドに取り込むことができます。 "

「一部の関数は静的として宣言してからユーティリティ クラスに移動できます。」

「しかし、これはリファクタリングの狭い解釈です。」

「リファクタリングとは、新しい機能を追加せずにプロジェクトのアーキテクチャを書き直す(改善する)ことを意味する場合があります。これは広義のリファクタリングです。」

「IntelliJ IDEA が最も人気のある統合開発環境 (IDE) になったのは、特に、IntelliJ IDEA が非常に強力なリファクタリング ツールを初めて導入したためです。」

「この魔法の道具は何ですか?」

魔法のトリック #1: メソッドの名前を変更します。

「コードに 100 ~ 500 の異なる場所から呼び出されるメソッドがあると想像してください。あなたはその名前をもっとわかりやすいものに変更することにしました。それが run() で、それを runDownloadTaskAsync() にしたいとします。それはできますか?」

「そうですね、まずメソッドの名前を変更する必要があります。次に、そのメソッドが呼び出されるプログラム内のすべての場所を見つけて、そこでも名前を変更します。」

「そして、どうやってそれらの場所を見つけますか?」

「プログラムを実行するだけで、IntelliJ IDEA は存在しないメソッドが呼び出される場所をすべて表示します。」

「わかりました。しかし、すべてのメソッドにそのメソッドの動作を説明する説明コメント (JavaDoc) があり、そこに古いメソッド名が書かれているとします。」

「コメントも変更させていただきます。」

「しかし、名前がメソッドの名前に関連付けられている変数も存在する可能性があります。それらも変更するとよいでしょう。」

Task task = manager.run();
Task asyncTask = manager.runDownloadTaskAsync();

「そうですね、それらの変数の名前も変更すると良いでしょう。問題はありません。」

「なるほど、IntelliJ IDEA を使用すると、これらすべてをわずか数秒で行うことができます!」

「メソッド名の上にカーソルを置き (またはマウスでクリックし)、Shift+F6を押して目的のメソッド名の入力を開始します。」

「メソッド名を編集する例を示します。」

「編集を開始します:」

アイデア: リファクタリング - 1

「新しい名前を指定してください:」

アイデア: リファクタリング - 2

「新しい名前を入力して Enter キーを押すだけです。このメソッドは、プロジェクト内で呼び出されるすべての場所で名前が変更されます。」

「IntelliJ IDEA は通常、コメント内の変数名とメソッド名の名前を変更するかどうかを尋ねます。[はい] をクリックするだけで、すべてが変更されます。」

「さらに、プロジェクトがこのリファクタリング操作の前にコンパイルされた場合、リファクタリング後にもコンパイルされることが保証されます。」

「とても有望ですね。」

「ちなみに、同じ方法で変数名を変更することもできます。名前をクリックした後、Shift+F6を押すだけです。新しい名前を入力すると、IntelliJ が使用されている変数名を変更します。

「変数がクラス内のフィールドであり、ゲッターとセッターがある場合、ゲッターとセッターの名前も変数の新しい名前に一致するように変更されます。」

「変数を使って試してみました。すべてあなたの言ったとおりに動作します、エリー。リファクタリングは素晴らしいです!」

「リファクタリングに必要なのはこれだけだと思いますか? リファクタリングは非常に幅広いトピックです。まだ表面をなぞっただけです。」

「うわー。他に何があるの?」

魔法のトリック #2: 変数を抽出します。

「コード内で特定の式が頻繁に繰り返されるため、それらを別の変数に移動したくなる場合があります。例:」

コード
public void printInfo(User user)
{
 System.out.println(user.getProfile().getName());
 System.out.println(user.getProfile().getAddress().getState());
 System.out.println(user.getProfile().getAddress().getCity());
 System.out.println(user.getProfile().getAddress().getStreet());
 System.out.println(user.getProfile().getAddress().getHomeNumber());
}
どのように見せたいか:
public void printInfo(User user)
{
 Address address = user.getProfile().getAddress();

 System.out.println(user.getProfile().getName());
 System.out.println(address.getState());
 System.out.println(address.getCity());
 System.out.println(address.getStreet());
 System.out.println(address.getHomeNumber());
}

「ああ」

「また、コードは繰り返しの部分が多くなり、さらに複雑になる場合があります。」

「プログラマーは意図的にそのように記述しているわけではありません。しかし、メソッドに何かを追加し、次に別の何かを追加する必要があることがよくあります。そのため、時間が経つにつれて、繰り返しの数が膨大になります。」

「別の変数を作成することで、適切な名前を付けることができ、コードの可読性が向上します。」

「たとえば、上の例では、おそらく自宅の住所について話しているのではありません。おそらく、緊急連絡先の住所について話しているのでしょう。その場合、この変数を単なる住所ではなく、EmergencyContactAddress と呼ぶことができます。次に、プログラマーは、このコードを初めて見ると、ここで何が起こっているのか理解できるでしょう。」

「はい、同意します。そのような変数を追加することは理にかなっています。」

「それで、どうやってやるの?」

「式を別の変数に移動するのは非常に簡単です。」

ステップ 1: マウスを使用して式を選択します。

アイデア: リファクタリング - 3

ステップ 2: Ctrl+Alt+V を押します。

アイデア: リファクタリング - 4

「ウィンドウが開き、選択した式のみを置換するか、式のすべてのインスタンス (4 個) を置換するかを IntelliJ IDEA が尋ねます。」

「すべての出現を置換するには 2 番目のオプションを選択します (4 つの出現をすべて置換)」

ステップ 3: Enter キーを押します。

アイデア: リファクタリング - 5

「IntelliJ IDEA は変数名の入力を求めます。また、独自の名前の提案も行います。悪くありませんね?」

「うーん。そのとおりです。変数に 'address' という名前を付けることも計画していました。どうやってそれがわかったのですか?」

「アドレスを返す式の最後のメソッドの名前を使用します。したがって、変数はアドレスを格納するために使用される可能性があります。」

「本当にうまくいきました。素晴らしいですね、エリー。」

魔法のトリック #3: コードを別のメソッドに抽出します。

「しかし、他のこともできたでしょう。新しいメソッド、たとえばprintAddress () を宣言して、このコードをすべてその中に移動することもできました。」

「それをやってみましょう。」

ステップ 1: アドレス変数を使用するコードの 4 行を選択します。

アイデア: リファクタリング - 6

ステップ 2: Ctrl+Alt+M を押します。

アイデア: リファクタリング - 7

「IntelliJ IDEA は、メソッドに必要な変数を決定し、そのメソッドがどのようなものであるべきかを提案します。残っている唯一のことは、メソッドの名前を入力することです。」

ステップ 3: メソッド名として printAddress を入力し、Enter キーを押します。

アイデア: リファクタリング - 8

"お気に召しましたか?"

「これは素晴らしいことです。IntelliJ IDEA はコードを別のメソッドに抽出しただけでなく、必要な変数をすべて追加しました。さらに、すべての名前を正しく推測しました。」