特集

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

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


■名前の変更

 これは変数、クラス、名前空間などの名前を変更する。たかが名前を変える程度のことで、リファクタリング支援機能などというたいそうな名前を付ける必要がどこにあるのかと思うかもしれない。だが、単にテキスト・エディタで名前を書き換えるのとは訳が違うのだ。その名前を参照している個所も含めて書き換えが行われるのである。ならば、複数ファイルの一括置換ではないのか……と思うかもしれないが、そうではない。もっと強力なのである。それは、論より証拠、試してみればすぐに分かる。

 ここでは、以下のようなサンプル・プログラムを用意した。これは、コンソール・アプリケーションとクラス・ライブラリの2つのプロジェクトを含むソリューションとする。

 まず、コンソール・アプリケーションのメインとなるC#ソース・コードは以下のようなものだとしよう。

using System;

namespace Sample001
{
  class Program
  {
    static void Main(string[] args)
    {
      SampleSub001.Class1.WriteSample();
      SampleSub001.Class2.WriteSample();
    }
  }
}
コンソール・アプリケーションのコード

 一方、クラス・ライブラリのメインとなるC#のソース・コードは、以下のようなものだとしよう。

using System;

namespace SampleSub001
{
  public class Class1
  {
    public static void WriteSample()
    {
      Console.WriteLine("Hello!");
    }
  }
  public class Class2
  {
    public static void WriteSample()
    {
      Class1.WriteSample();
      Class1.WriteSample();
      Class1.WriteSample();
      Class1.WriteSample();
      Class1.WriteSample();
    }
  }
}
クラス・ライブラリのコード

 ここで、Class1クラスのWriteSampleメソッドの定義部分で、「WriteSample」というキーワードを右クリックし、[リファクタ]−[名前の変更]を実行してみよう。

[名前の変更]ダイアログ
[リファクタ]−[名前の変更]の実行により表示される。

 ここで名前を「WriteSample」から「WriteHello」に書き換えて[OK]ボタンをクリックしてみよう。すると、変更のプレビューが表示される。

[変更のプレビュー - 名前の変更]ダイアログ
名前修正のプレビュー画面。事前に変更内容をチェックできる。

 ここでは、上部のリストから変更個所を選択すると、それに相当するソース・コードが下部に表示され、具体的な変更内容を確認することができる。確認のうえ、[適用]ボタンをクリックして書き換えてみよう。

 クラス・ライブラリのメインとなるコードは、以下のように変化した。

using System;

namespace SampleSub001
{
  public class Class1
  {
    public static void WriteHello()
    {
      Console.WriteLine("Hello!");
    }
  }
  public class Class2
  {
    public static void WriteSample()
    {
      Class1.WriteHello();
      Class1.WriteHello();
      Class1.WriteHello();
      Class1.WriteHello();
      Class1.WriteHello();
    }
  }
}
「名前の変更」により書き換えられたクラス・ライブラリのコード
Class1クラスの「WriteSample」を「WriteHello」に「名前の変更」をした結果。Class2クラスのWriteSampleメソッドの名前は書き換えられていない。

 これを見て分かるとおり、名前を変更したメソッドを参照していた行はすべて書き換えが行われた(「Class1.WriteSample();」→「Class1.WriteHello();」)。しかし、たまたま同名のClass2クラスのWriteSampleメソッドの名前は変更されていない。つまり、リファクタリング支援機能の名前の変更は、単なる一括置換などではなく、プログラムの意味を理解したうえで的確な書き換えを行う機能なのである。

 それだけではない。コンソール・アプリケーションのメインとなるC#ソース・コード、つまり別プロジェクト上のソース・ファイルを見てみよう。

using System;

namespace Sample001
{
  class Program
  {
    static void Main(string[] args)
    {
      SampleSub001.Class1.WriteHello();
      SampleSub001.Class2.WriteSample();
    }
  }
}
「名前の変更」により書き換えられたコンソール・アプリケーションのコード
Class1クラスのWriteSampleメソッド呼び出しは書き換えられたが、Class2クラスの同名のメソッドの呼び出しは書き換えられていない。

 見てのとおり、別プロジェクトであってもClass1クラスのWriteSampleメソッド呼び出しは、正しくWriteHelloメソッドの呼び出しに置き換えられた。これによって、即座にコンパイルは通り、プログラムを実行することができる。一方、この書き換えとは関係ない、たまたま同名のメソッドである「SampleSub001.Class2.WriteSample()」の方は、一切名前の変更の対象にはなっていない。

 以上のように、名前の変更機能は非常に強力であり、かつ気楽に使うことができる。変更の結果コンパイルが通らなくなるのではないかとおびえつつ一括置換するのとは比較にならない快適さである。これによって、変数、メソッド、クラスなどの名前を、より分かりやすい名前に変更していけば、それだけでもソース・コードの分かりやすさは向上するだろう。たかが名前の変更ではあるが、すべての基本となる重要な機能といえる。


 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 記事ランキング

本日 月間