変数のリファクタリングに関しては、前編で紹介した「名前の変更」の他に、説明用変数の導入やインライン化などがサポートされている。
変数に代入したい式を指定し(次のコード)、[Ctrl]+[,]を押すなどしたら、リファクタリングサポート機能の[{指定部分} に対してローカルを導入します]または[{指定部分} のすべての発生に対してローカルを導入します]を選ぶ*1。
string result;
if (n % 3 == 0)
{
if (n % 5 == 0)
result = "Fizz Buzz";
else
result = "Fizz";
}
else
{
if (n % 5 == 0)
result = "Buzz";
else
result = n.ToString();
}
仮の変数名をリネームした後の結果は、次のコードのようになる。
string result;
bool isMultipleOf5 = n % 5 == 0;
if (n % 3 == 0)
{
if (isMultipleOf5)
result = "Fizz Buzz";
else
result = "Fizz";
}
else
{
if (isMultipleOf5)
result = "Buzz";
else
result = n.ToString();
}
*1 英語の原文:
ここで「occurrence」は「出現」の意。後者は、指定した部分だけでなく、同じ部分を探し出して全てを新しく導入する変数に置き換える。
『説明用変数の導入』とは逆向きの機能である。
インライン展開したい変数を指定し、リファクタリングサポート機能の[インラインの一時変数]を選ぶ*2。この例に示すように、単純な展開だけでなく、C# 7の新機能「パターンマッチング」を使った書き換えもサポートされている(次のコードはこの機能を使って、リファクタリング前のコードにあった一時変数をインラインに展開したものだ)。
// リファクタリング前
public static void SampleMethod1(Shape s)
{
var e = s as Ellipse;
if (e != null && e.Width == e.Height)
WriteLine("真円です");
else
WriteLine("真円ではありません");
}
// ↓
// リファクタリング後
public static void SampleMethod1(Shape s)
{
if (s is Ellipse e && e.Width == e.Height)
WriteLine("真円です");
else
WriteLine("真円ではありません");
}
*2 英語の原文:
試訳:「一時変数をインライン化する」
プロパティに変換したいフィールド(メンバ変数)を指定し、リファクタリングサポート機能の[フィールドのカプセル化]を選ぶ*3(次のコードはこの機能を使ってFirstNameフィールドをプロパティにカプセル化したものだ)。
// リファクタリング前
public string FirstName;
public string LastName;
public string GetName()
=> $"{FirstName} {LastName}";
// ↓
// リファクタリング後
private string firstName;
public string LastName;
public string FirstName { get => firstName; set => firstName = value; }
public string GetName()
=> $"{FirstName} {LastName}";
*3 「フィールドのカプセル化」のメニューには、正確には次の2つがある:
上の例では、前者を使っている。
次にVS 2017のリファクタリングサポート機能を使って、メソッドレベルのリファクタリングを行う方法を見てみる。
Copyright© Digital Advantage Corp. All Rights Reserved.