リファクタリングのルビコン川を渡る
2001年1月、2つのJavaツールがリファクタリングのルビコン川を渡りました。 Javaでのリファクタリングは今や本格的なツールサポートを得ています。
2001年2月
これを読んでいる方はおそらくご存知かと思いますが、私はリファクタリングの大ファンです。ここ数年、リファクタリングについて執筆したり、講演したりしてきました。しかし、私はリファクタリングの初期段階にあることも知っています。私の著書では、プログラムを手動でリファクタリングする方法を解説しています。しかし、手動でのリファクタリングは、まるで斧で森を切り開くようなものです。問題に本格的なチェーンソーを投入するには、リファクタリングツールが必要です。
もちろん、リファクタリングツールは未知のものではありません。私がリファクタリングに関する書籍の執筆を始める前から、John BrantとDon RobertsはSmalltalk Refactoring Browserを開発しました。この素晴らしいツールによって、リファクタリングははるかに迅速で快適なものになりました。問題は、これがSmalltalkツールであり、Smalltalkを使用する人が少ないということです。実際、ここ数年、私はJavaでほとんどの作業を行ってきたため、リファクタリングブラウザはほとんど使用したことがありません。
しかし、リファクタリングブラウザは1つのことを明確に示しています。リファクタリングに対するツールサポートは、可能であり、価値があるということです。私は常に、時間の問題だと考えていました。人気のあるメモリ管理言語として、Javaにはすぐにこのようなツールが導入されると期待していました。
ルビコン川への接近
1999年、多くの人々が、リファクタリングをサポートするツールを開発していることを私に連絡してきました。これらのツールのリストはwww.refactoring.comに掲載しています(wikiにも別のリストがあります)。 refactoring.comはWebのハブとは言えませんが、人々は明らかにリファクタリングツールにリストされることを望んでいました。
しかし、私はサイトでリファクタリングツールをレビューすることにはまったく興味がありません。興味のあることはたくさんありますが、ソフトウェア製品のレビューはその1つではありません。リストを維持することは構いませんが、レビューは他の人に任せます。
とは言え、いくつかの最低限の基準は必要です。いくつかのベンダーが、自分のツールについて言及してほしいと依頼してきました。「メソッドの移動」機能を調べてみたところ、メソッド本体をあるクラスから別のクラスに移動することはできますが、呼び出し元は変更していませんでした。その結果、変換を適用するとプログラムがコンパイルできなくなり、意味を保持しているとは言えません!
より正直に機能を説明しているツールもありました。多くのツールが、メソッド名の変更など、さまざまな種類の名前変更機能を提供していました。呼び出し元が調整されていれば、名前の変更はリファクタリングとしてカウントされます。また、いくつかのツールはクラスの移動をサポートしており、Javaではリパッケージが面倒であるため、これは非常に役立つリファクタリングです。
これらはすべて励みになる兆候でした。それでも、私は本気で興奮してはいませんでした。これらはすべてステップでしたが、越えるべき重要な障壁がありました。
ルビコン川
これまで説明してきた名前変更の種類では、ソフトウェアの分析が必要になりますが、それは比較的浅いものです。プログラムの構造を深く掘り下げなくても、名前変更を行うことができます。実際、多くの人々が、エディターの検索/置換や、単純な正規表現ベースのスクリプトを使用して手動で名前変更を行っています。リファクタリングを完全に行うには、JohnとDonが書籍で説明しているように、プログラムの構文木を分析および操作する必要があります。
この機能を必要とするリファクタリングは、メソッドの抽出です。 Amazonのレビュー担当者はこれを単なるカットアンドペーストと説明しましたが、メソッドの抽出には実際にかなりの作業が必要です。メソッドを分析し、一時変数を特定し、それらをどう処理するかを考え出す必要があります。この分析は、正規表現操作では実行できません。慎重な作業が必要です。
だからこそ、私はそれを重要なリファクタリングだと考えています。メソッドの抽出ができるということは、おそらく他のリファクタリングもできることを意味します。それは、「私はこれに真剣に取り組んでいる」というサインです。
ルビコン川を渡る
ルビコン川を渡る本格的な試みが始まったと思われた最初のきっかけは、1999年半ばにInstantiationsから連絡があったときでした。ご存じない方のために説明すると、Instantiationsは、OO界で最も高く評価されている名前の1つです。ポートランドSmalltalkコミュニティから生まれた同社は、Digitalkの主要な一部であり、Smalltalkで多くの重要な作業を行いました。その後、Javaに移行し、ネイティブコンパイラであるJoveを含むいくつかの製品を開発しました。
Instantiationsがリファクタリングツール(当時はAlchemyというコードネームで、現在はjFactorと呼ばれています)の開発を開始したと聞いたとき、彼らは優れた仕事をするための理解を持っていることを知っていたので、私は興奮しました。彼らが最初に取り組むリファクタリングがメソッドの抽出であると言ったとき、私はさらに励まされました。
しかし、最初に川を渡ったのは彼らではありませんでした。その栄冠は、Marian Vittekによって開発されたemacsのプラグインであるX-refに与えられます。正直なところ、私はemacsでJavaを使用しないため、これは私に大きな影響を与えませんでした。また、x-refの抽出にはいくつかの制限があり、Marianの会社は小規模な運営です。しかし、それが達成されており、emacsを定期的に使用する場合は一見の価値があります。
X-refがルビコン川を渡る手漕ぎボートだったとすれば、Instantiationsは華麗に川を渡りました。彼らのツールであるjFactorは、非常にプロフェッショナルな外観のツールで、メソッドの抽出を含む優れたリファクタリングのリストをサポートしています。jFactorは、IBMのVisual Age for Javaのプラグインとして入手できます。これで、メソッドの抽出は、コードを選択し、メニュー項目を選択して、名前を入力するだけで済みます。リファクタリングがスタイリッシュに実現しました。
jFactorだけでも、2001年1月はリファクタリングにとって画期的な月だと考えていましたが、嬉しいサプライズがありました。IntelliJはしばらくの間、Visual Ageのような検索機能で人気のあるJava用IDEを構築していました。彼らはツールにさまざまな名前変更機能を追加し、Visual Ageを使用できなかったこの6階では、少しお気に入りになりました。そして1月、驚くべきメールを受け取りました。彼らのIDEAツールがメソッドの抽出をサポートするようになったのです。
さらに進む
1月の出来事は私にとってわくわくするものでした。なぜなら、リファクタリングツールがソフトウェアエンジニアリングに大きな影響を与えるだろうと確信しているからです。実際、私はJohnとDonのリファクタリングブラウザを、IDE以来の開発ツールにおける最大の進歩と呼んでいます。また、メソッドの抽出というルビコン川が渡られた今、さらに多くのリファクタリングが行われることを願っています。ぜひこれらのツールをチェックして、リファクタリング機能を試してみてください。
付記として、これらのツールのレビューは行いません。適切なレビューを行うには時間がかかりすぎます。私はこれらのベンダーと連絡を取り合い、彼らの開発を支援するためにできる限りのことを行っています。しかし、これらのツールに関するフィードバックを見てみたいと思っています。また、refactoring.comでリファクタリングツールに関するリストを維持し続けます。ベンダーが私と共有した場合、ツールニュースもそのサイトに投稿します。
重要な改訂
2001年2月:martinfowler.comに掲載されたオリジナルの記事