Android Studio最速入門~効率的にコーディングするための使い方

第36回 リファクタリングについて

この記事を読むのに必要な時間:およそ 4 分

はじめに

コード補完に並ぶIDEならではの機能,リファクタリングについてです。Android Studioの元になったIntelliJ IDEAは,元々リファクタリングツール(IntelliJ Renamer)から発展してきたIDEのため,リファクタリング機能に関しては定評があります。

こちらの予想のナナメ上をいく精度でリファクタリングを行うため,人によっては「神ががっている」と思う人もいれば,行きすぎとも思える精度のため「何これ?わけわからん」と思う人と受け取りかたもさまざまです。

要するにクセがあるわけですが,せっかくの高性能リファクタリングを眠らせておくのももったいないので,今回の解説がみなさんの理解の助けになれば幸いです。

リファクタリングの基本

第8回でも紹介しましたが,Android Studioにとって「Projectツールウィンドウ」で行うファイル操作のほぼすべてがリファクタリングになります(例外は「新規作成」くらいです)⁠

ファイル操作の対象がJavaのソースコードである無しに関わりなく,リファクタリングとして機能します。ファイルの移動やコピーは,カット("Cut")⁠コピー("Copy")⁠ペースト("Paste")やマウス操作で代用できるのであまり意識することが無いのですが,メニュー操作する場合は「Refactor」メニューから該当のコマンドを実行することになります。

別にリファクタリングしなくてもいい場合

Javaのソースコードに限らず,どんなファイルでもリファクタリング対象にするのは便利な反面,ありがた迷惑な時もあります。

「やりたいのは,リファクタリングではなく単なるファイル操作なんだ」という場合は,意固地にAndroid Studio上で操作を行わず,素直にOS付属のファイラ(ExplorerやFinder)で作業したほうが早くて簡単です。それを見越してか「Projectツールウィンドウ」のコンテキストメニューには "Reveal in Finder"や"Show in Explorer" というコマンドがあります(詳細は第8回を参照)⁠

または「Terminalツールウィンドウ」で操作してしまうのも一興です。

Android Studioの外からプロジェクト内のファイル操作をした場合,しばらくするとその変更結果がAndroid Studioに反映されます。即時で反映したい場合は,Fileメニューかツールバーの "Synchronize"」を実行してください。

Javaのリファクタリングは主にエディタ上で行います。対象箇所にカーソルをあてて,メニューバーの「Refactor」からお望みのリファクタリングコマンドを実行します。キーストロークは大差ありませんが,リファクタリングに関しては専用のクイックリストのようなコマンド "Refactor This..." があります。

図1 ⁠Refactor This...」の実行例

図1 「Refactor This...」の実行例

実行できるリファクタリングコマンドはコンテキスト依存で絞られるますが,それでもコマンドは数多くあります。なので比較的よく使うであろうリネームや抽出系("Extract ~")あたりはショートカットキーを覚えてしまいましょう。

リファクタリングの実演

では実際にリファクタリングを行ってみます。おそらく最も使うであろうリネーム("Rename...")を例に進めます。

その前に大事な事をひとつ。Android StudioにはEclipseのクイックフィックスCtrl+1やクイックアシストCtrl+2のような万能コマンドはありません。やりたいこと(コマンド)をハッキリ指示しないと何もしてくれません。

一応,インテンションAlt+Enterに,いくつかリファクタリングを促す候補がでますがちょっとしたヒントでしかなく,やりたい事は利用者が明示的に指示する必要があります。このあたりの不親切さ/控えめさはAndroid Studioの特徴のひとつなので慣れるしかありません。

本題に戻りリネームを実演してみます。エディタ上でカーソルをリネームしたい対象に置き "Rename..." 実行します。大抵の場合,その場でリネームする候補が展開されます。

図2 "Rename..."の実行例

図2 

リネームの対象になり得るのはたくさんあります。ざっと挙げただけでも,以下の通りです。

  • 変数名(ローカル変数,インスタンス変数,クラス変数)
  • 引数名
  • クラス名,インターフェイス名
  • パッケージ名

リネームを指示する場所と対処によっては,図3のように「継承元をリネームするのか」それとも「その場のものをリネームするのか」と問い合わせてきます。

図3 メソッドのリネーム例

図3 メソッドのリネーム例

意外かも知れませんが,リファクタリングはJavaのソースコードだけではなく,リソースファイル(XMLファイル)に対しても有効です。たとえば,次の対象もリネームできます。

  • タグ名,属性名
  • 属性値の参照関係

「属性値の参照関係」とは,たとえば,とあるXMLタグの属性値で参照している@string/<ref_name><ref_name>をリネームすると,それを宣言しているstring.xmlの該当箇所もリネームする事を指します。

こちらの予想に反していろんなところでリネームに反応します。⁠これリネームできたらいいな」と思ったらダメ元でも良いので"Rename..."を実行してみましょう,新しい発見があるかも知れませんよ(反応しなかったときの落胆もかなりのものですが……)⁠

リネームの候補がその場に出てくることを「In-placeモード」と呼びます。このオプションを外す人は少ないと思いますが,In-placeモードは「Preferences / Editor」「Enable in-place mode」でON/OFF可能で,OFFにすると常に「Rename」ダイアログが表示されるようになります。昔話になりますが,元々はダイアログによる指示のみだったのですが,Eclipseのリファクタリングを真似てIn-placeモード取り込みました。その名残として,このオプションが残っています。

図4 ⁠Preferences / Editor」設定画面

図4 「Preferences / Editor」設定画面

とはいえ,Android Studio本来のリファクタリングの流れは「コマンド実行 → 完了」ではなく「コマンド実行 → ダイアログでオプション設定 → 完了」が正しいのです。リネームも対象によってはIn-placeモードで即実行されず,常にダイアログが出てくるケースがあります。

著者プロフィール

今井勝信(いまいまさのぶ)

システムエンジニア。日本ユニシス株式会社所属。仙台在住。

Android開発はまったくやったことがないけれどIntelliJ IDEAが大好き。

Twitter: @masanobuimai

コメント

コメントの記入