複数クラスを移動させた時に namespace も自動で変更したい

こんにちは。沖縄移住組 IT エンジニアの勇大(@yudy1152)です。

開発する時に、JetBrains の IntelliJ IDEA という IDE を使用しています。

1つのディレクトリ内にたくさんのクラスファイルが出来てきて、適切な名前空間で区切ってファイル構成を変更したい時に便利な操作方法を紹介します。

また、操作をするうえで少しハマったポイントなども書き留めます。

やりたいこと

Kodama, Hikari, Nozomi の各クラスは SinkansenInterface を implements している関係になっています。 TestA は Sinkansen とは関係のない「その他」扱いのクラスを表わしています。

そのため、赤枠で囲まれた Sinkansen に関する4つのファイルのみを、下図右のツリーのように Sinkansen ディレクトリ内に移動させ、同時に namespace も変更させます。

f:id:yudy1152:20190328162113p:plain

f:id:yudy1152:20190328212022p:plain

操作方法

namespace で右クリック

  • 3行目で定義している namespace 名の箇所で右クリックします。
  • 「Refactor -> Move」をクリックします。

f:id:yudy1152:20190328150731p:plain

移動先となる namespace を入力

  • ダイアログが開くので「Sinkansen」を入力します。
  • 「Refactor」をクリックします。
  • ハマったポイント(原因は不明です)
    • ダイアログが開いた直後に「New Namespace name」の入力欄で文字を入力しようとしても入力出来ませんでした。 すぐ下にある「Target destination directory」のプルダウンを選択後、何もせずに再度「New Namespace name」の入力欄をクリックすると文字を入力することが出来ました。

f:id:yudy1152:20190328150752p:plain

  • そのまま「OK」をクリックします。
  • ハマったポイント(ここもよく分からない点です・・・)
    • App\Test の namespace 内にあるクラスが一覧で出てきます。
    • 最初に操作をした Hikari 以外のクラス(Kodama, Nozomi, SinkansenInterface, TestA)が表示されます。
    • 表の一番下は TestA です。なので、このチェックボックスを外せば移動対象から外せるかと思いましたが、そういうわけでもなさそうです。
    • チェックを外していたとしても、この後の画面を見ても分かると思うのですが、結局 TestA が移動対象として出てきてしまいます。

f:id:yudy1152:20190328220026p:plain

移動対象を絞る

  • 「Refactoring Preview」が表示されます。
  • 今回、TestA は移動させたくないので TestA で右クリックします。
  • 「Remove」をクリックします。クリック後、TestA は非表示になります。(実際に削除されるわけではないのでご安心を!)

f:id:yudy1152:20190328221538p:plain

  • または、TestA を選択し、バックスペースを押すと取り消し線が表示され、移動対象外にすることができます。

f:id:yudy1152:20190328221623p:plain

  • 移動対象を絞った後に、「Do Refactor」をクリックし、これで完了です!

補足

キャプチャを撮ったりするために、ファイル構成などをだいぶ簡略にしていますが、これら移動対象のクラスを new するなどして呼び出している側の use も自動で変更されます。

最後に

使用頻度は少ない操作だろうなぁと思ったのですが、忘れてしまいそうなので書き留めました。

そしてまだまだ IntelliJ を使いこなせていないので、もっと便利な機能とかを紹介できるくらいに使っていきたいなと思います!