matarillo.com

The best days are ahead of us.

31日間ReSharper一周 Day 30: リネーム(伝播リネームを含む)

2012-12-30 18:17:12

元記事

31日間ReSharper一周」の30日目にようこそ。

今日は全リファクタリングの母について。「リネーム」だ。F2で利用できる。もちろんCtrl+Shift+Rメニューから使うこともできる。

今となっては「リネーム」リファクタリングについて言わなきゃいけないことはそんなにない。まとめて言えば、機能したりしなかったりだ。すごさにも限度はあるけど、ReSharperではすてきな技をいくつかキメることができる。

注: 技術的な問題や、計画不足や、何回かの大吹雪なんかが相まって、現在自宅でReSharperを使うことができない。だから今日の(たぶん明日も)投稿にはスクリーンショットが無いし、詳細は記憶頼みだ。もし何か間違ってたら訂正してほしい。それらはいつか反映させるから。

局所変数のリネーム: 同期編集と提案

局所変数をリネームするとき、ReSharperでは同期編集(僕がこう呼んでるだけで公式名称ではない)によりエディタ上で変更できる。変数名の提案リストもポップアップするから、リストから名前を選ぶこともできる。

僕はDelphiに慣れているが、Delphiでは同期編集モードを終了して変更を確定させるのにEscを押さないといけなかった。ここからの転向はReSharperには準備不足だったね。というのは、ReSharperの同期編集でEscを押すと、変更が取り消されてしまうんだ。ReSharoerでは、変更の確定にはEnterを押さないといけない(そう、もしDelphiでも同じ動きをするんならとても納得のいくことだったんだろうけど)。

今はEnterを押して変更を保存するのは納得なんだけど、弱点もある。もし変数名リストが表示されていたら、Enterを押すとリストで選択中のアイテムが選ばれてしまう。だから例外オブジェクトに名前をつけようとして、たとえばexとするけど、exと入力してEnterを押しても変数名はexにリネームされない――exceptionになってしまうだろう。なぜならexで始まる変数名の提案の先頭だからだ。

短い変数名を入力するための回避策は次の通り。Enterを1度押せば変数名提案は消えるけど、同期編集はまだ終わらない(提案リストがもう消えていても、もう1度Enterを押す必要がある。押さないとリネームは取り消される)。だから、Escを押して提案リストを消し、それからEnterを押してリネームを確定させよう。

クラスのリネーム: 伝播リネーム

僕は長い間、伝播リネームのリファクタリングを待ち望んでいた――関係する全コードに影響するやつ。たとえば、SongFileという名前のクラスがあったとすれば、songFileとかfileという名前の変数や、SongFileという名前のプロパティやなにかがたくさんある可能性が高い。僕が望むリネームとは、SongFileからSongDataStoreに変えたら、それら変数名やプロパティ名のすべてに影響して、そっちもリネームしてくれるものだ。

ReSharperにはその機能がある。

さて、どちらにせよ普通は、クラスをリネームするときはウィザードが表示され、最初のページでは新しい名前を聞かれる。そこまでは何も目新しくない。しかしその後、次のような変数とプロパティを探す。(1)リネームする型に一致するもの、(2)変えようとする名前の一部分に似た名前をもつもの。そして2番目のページでそれらをリストアップし、それら全部に新しい名前を提案してくる。リネームしたくないものはチェックをはずすこともできるけど、そうする意味はあるか?

唯一の弱点は、子孫クラスには同じことをしてくれないことだ。でも僕は機能要求を起こしたから、いずれきっと……


31日間ReSharper一周 インデックスへ戻る