特集

Visual Studio 2005
「リファクタリング支援機能」徹底レビュー

株式会社ピーデー 川俣 晶
2006/02/08


実は不完全なVS 2005のリファクタリング機能

 以上、ここまでVS 2005のリファクタリング支援機能をほとんど手放しで称賛してきたが、本当に手放しで褒めたたえてよいのかというと、そうではない。

 例えば、あなたが先輩であるベテラン・プログラマーの前で、「ソース・コードをきれいに書き直しましょう! いまはやりのリファクタリングです!!」といったとしよう。たいていの場合、こっぴどく叱られて書き直しは許されないと思う。書き直しを行わない判断はたいていの場合正しい。なぜなら、動いているプログラムのソース・コードを1文字だろうと書き換えることは、非常に危険な行為だからだ。

 それにもかかわらずリファクタリングという手法が生み出されて成果を上げているのは、これが必ず「自動化された単体テスト」と呼ばれる手法と併用されるからである。

 つまり、クラスやメソッドを単位としたテスト・プログラムを必ず作成し、それをワンタッチで実行できるように自動化したうえでのみ、ソース・コードの書き換えは許されるのである。このようなテストがあれば、誤った書き換えは即座に検出できるのである。

 もちろん、「自動化された単体テスト」は完ぺきではなく、すべての問題を検出することはできないだろう。しかし、これはソース・コードの書き換えを行う勇気を得るために使うものである。そして多くの場合、誤った書き換えはこれによって検出されるため有益である。

 そして、ここが最も重要なことであるが、VS 2005においてテスト機能は開発者ではなくテスターのための機能として扱われており、リファクタリング機能を持ったすべてのエディションでテスト機能が提供されるわけではないのである。

 つまり、自動化された単体テストとワンセットでなければ使うべきではないリファクタリング機能であるにもかかわらず、テスト機能抜きで提供されているエディションが存在し、非常に危険なのである。これは、アクセルだけ付いていて、ブレーキは付いていない自動車を売るのに似た行為といえる。

 ちなみに、ツールを使って自動的に書き換えを行っていれば、リファクタリングを行っても安全ではないのか、という疑問は当然あり得るだろう。もちろん、手動で書き換えるよりも、ツールによって書き換えた方が安全性は高い。しかし、一見関係ないように見える書き換えによって思わぬ悪影響が発生することがあるのがプログラム開発の世界である。

 例えば、どこかにリフレクションによるメソッド呼び出しがある場合、それはリファクタリング支援機能によって自動的に正しく認識されないかもしれない。また、同一ソリューションで管理されていない別のプロジェクトから参照されている場合、それらプロジェクトには自動修正は及ばない。そのほか、容易に予測できないさまざまなトラブルの発生があり得るだろう。

VS 2005で正しくリファクタリングを行う方法

 さて、話はまだ終わらない。リファクタリングとは、本来は数十の作業項目を持つ書き換え手順のカタログである。しかしVS 2005には、ここで紹介した7種類のリファクタリングしか存在しない。つまり、非常に多くのリファクタリング項目に対応していないのである。

 だが、それはよい。なぜかといえば、この記事で繰り返しリファクタリング「支援機能」と書いているとおり、これらの機能はリファクタリングを行う機能ではなく、それを支援する機能でしかないからだ。

 リファクタリングとは、それを適用する必要性の判断に始まり、ソース・コードの書き換え、そして「自動化された単体テスト」の実行による結果の検証まで含めた作業を示す。リファクタリング支援機能がやってくれるのは、このうちの「ソース・コードの書き換え」の手順だけなのである。さらに、書き換えも機械的に容易に実行できるものとそうではないものがある。VS 2005が支援してくれるのは、このような容易に自動化できる作業だけに限られると思ってよいだろう。それはそれで構わない。

 真の問題は、リファクタリングに関して、VS 2005のドキュメントがそのような事情をあまりよく説明していないことにある。リファクタリングとはVS 2005に備わった7つの機能を使うことであり、機能を使いさえすればリファクタリングだという誤解を招くのではないかという懸念がある。

 以上のことから考えるに、マイクロソフトはいまだにリファクタリングや、それを前提としたテスト駆動開発などの新しい開発方法論を正しく理解していないのではないかという疑問さえ発生する。

 では、VS 2005はリファクタリングに関して欠陥があるから使うべきではないのだろうか?

 そうではない。VS 2005には長所も多く、使えるならぜひとも使うべきだろう。リファクタリング支援機能でも、「メソッドの抽出」などは非常によくできていて、活用できるケースにはぜひ活用したい。

 つまり、VS 2005には明らかな欠陥があるという認識を持ったうえで、それをユーザー側で対処して乗りこなしてしまえばよいのである。つまり、以下の3点を踏まえたうえで、VS 2005を使いこなしてしまおう、ということである。

  • リファクタリング支援機能はリファクタリングの一部作業の手助けをするだけである
  • 自分が使うエディションに自動化された単体テストのツールが含まれない場合は、ツールを外部から調達してインストールする
  • リファクタリングは必ず自動化された単体テストとセットで行う

 なお、C#で利用できる単体テストのツールは複数存在するが、それらを公平に評価しているわけではないので、特定のソフトをここでは推奨しない。ちなみに、筆者は単体テストのフレームワークである「NUnit」と、それをVisual Studio内で実行可能にするプラグインである「TestDriven.NET」を使用している。

 いずれにしても、リファクタリングは人に優しい優れた手法である。VS 2005をうまく乗りこなして、Let's Enjoy Refactoring!End of Article

 

 INDEX
  [特集] VS 2005「リファクタリング支援機能」徹底レビュー
    1. リファクタリングとは何か?
    2. 名前の変更
    3. メソッドの抽出/フィールドのカプセル化
    4. インターフェイスの抽出/ローカル変数をパラメータへ昇格/パラメータの削除とパラメータ順序の再変更
  5. 実は不完全なVS 2005のリファクタリング機能
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間