Visual Studio編です。今回はコードの品質を高める強力な機能である「リファクタリング」について解説します。

Visual Studioのリファクタリング機能を使いこなせるようになると、「動くけれど読みにくいコード」を「動くし読みやすいコード」へと安全に改善できます。

以下のような方に役立つ内容となっています。

  • 「動くコード」を「読みやすいコード」に改善する方法を知りたい方
  • Visual Studioのリファクタリング機能をまだ使ったことがない方
  • 名前の変更(Rename)やメソッドの抽出(Extract Method)を実際に使えるようになりたい方
プロ太

リファクタリングは「動くコード」を「良いコード」に育てる作業です!デバッガと並ぶ、Visual Studioの強力な武器ですよ。

Visual Studioの基本機能については、以下の記事を参考にしてください。

C#入門編 Visual Studio 2022 初心者向けガイド ~基本から応用まで~ Visual Studio編です。今回はプログラミングにおける強力な味方であるVisual Studioについて基本から応用まで解説し...

リファクタリングとは?

リファクタリングとは、プログラムの動作を変えずに、コードの内部構造を改善することです。

プログラムを書いていると、「とりあえず動くコード」ができあがることが多いと思います。

しかし、そのコードが読みやすいか、後から修正しやすいかというと、必ずしもそうではありません。

リファクタリングが重要な理由は大きく3つあります。

  1. コードが読みやすくなる
    他の人や、数週間後の自分自身が理解しやすくなる。コードは「書く時間」より「読む時間」の方がずっと長い。
  2. 変更しやすくなる
    機能追加や修正がしやすくなる。どこを変更すればよいかが明確になる。
  3. バグが減る
    複雑なコードはバグの温床になる。シンプルなコードはバグが入りにくく、見つけやすい。
プロ太

リファクタリングで大事なのは「後でまとめて直そう」ではなく、「気づいたらこまめに直す」という習慣です。

Visual Studioのリファクタリング機能の全体像

リファクタリングは、基本的には手作業でコードを書き直す作業です。

しかし、名前の一括変更やメソッドの切り出しといった操作を手作業で行うと、変更漏れや引数の設定ミスなど、かえってバグを生んでしまうリスクがあります。

そこで、よく使う定型的なリファクタリング操作については、統合開発環境(IDE)であるVisual Studioが自動で支援してくれます。

実は、Visual Studioには50種類以上のリファクタリング機能が搭載されています。(Microsoft Learnの記事も参考にしてください。)

プロ美

そうなんだ!全部覚えるの大変そう…

プロ太

大丈夫!まずは今回紹介する2つだけ覚えれば、それだけでコードがグッと良くなりますよ。

これらの機能の多くは、Ctrl+.(クイックアクション)というショートカットキーから利用できます。

コードを書いていると、行の左側に電球アイコン(💡)が表示されることがあります。これは「ここ、改善できますよ」というVisual Studioからの提案です。

このアイコンが表示されたときにCtrl+.を押すと、(カーソル位置にリファクタリング候補がある場合に)利用可能なリファクタリング操作の一覧が表示されます。

本記事では、最も使用頻度が高く、初心者が最初に覚えるべき2つの機能に絞って解説します。

  • (1)名前の変更(Rename) — 変数名やメソッド名を安全に変更する
  • (2)メソッドの抽出(Extract Method) — コードの一部を新しいメソッドとして切り出す

(1)名前の変更(Rename)

なぜ名前が重要なのか

「良い名前 = 読みやすいコード」と言っても過言ではありません。

変数名、メソッド名、クラス名は、コードの意図を伝える最も重要な要素です。しかし、コードを書いている最中に最適な名前をつけられるとは限りません。

最初はxtmpといった仮の名前で書き始めて、後から意味のある名前に直したいということはよくあります。

このようなとき、手作業で名前を書き換えると、変更漏れが起きたり、別の変数まで書き換えてしまったりする危険があります。

Visual StudioのRename機能を使えば、こうした問題を心配せずに安全に名前を変更できます。

基本操作

名前の変更方法は変更対象(変数名、クラス名、メソッド名など)に対し以下のいずれかを行い、

  • 右クリックメニューで「名前の変更」を選ぶ
  • ショートカットキー(F2 もしくはCtrl+R, Ctrl+R

表示されたダイアログで名前を変更し、Enterキーを押すと反映されます。以下のようなイメージです。

Visual Studioがやってくれること

Rename機能は単純な文字列の置換ではありません。Visual Studioはコードの構造を理解した上で、以下のことを自動的に行ってくれます。

  • ソリューション全体で、その識別子のすべての参照箇所を自動的に変更
  • 変更前にプレビューで確認可能(どこが変更されるかを一覧で確認できる)
  • コメント内や文字列内の同名テキストも検出(オプションで変更可能)

以下は変更前にプレビューしている様子です。

プロ太

Renameは断トツトップで使うリファクタリング機能です。

名前変更は安全・簡単なうえ、良い名前の効果は劇的です。そのためコスパ最高のリファクタリングなのです。

過去のJetBrain社の調査(2021年)でも、統合開発環境においてRename機能が最も利用されていることが示されています。(参考文献

次に紹介するメソッド抽出機能も、多く使われる機能の1つです。

(2)メソッドの抽出(Extract Method)

なぜメソッドを分割するのか

プログラムを書いていると、1つのメソッドにたくさんの処理を詰め込んでしまいがちです。しかし、長いメソッドは理解しにくいコードの典型です。

理想は「1つのメソッドには1つの責務」です。処理を役割ごとにメソッドへ分割し、それぞれに適切な名前をつけることで、コードが「何をしているか」が明確になります。

基本操作

メソッドの抽出は、抽出したい箇所を選択したうえで、以下のショートカットキーで行います。

  • Ctrl+R, Ctrl+M
  • Ctrl+. → 表示されたメニューから「メソッドの抽出」を選択

以下のように、ダイアログでメソッド名を入力(デフォルトはNewMethod)すると、新しくメソッドが作成されます。

Visual Studioがやってくれること

メソッドの抽出は、単にコードをコピー&ペーストするのとは大きく異なります。Visual Studioが以下の判断を自動的に行ってくれます。

  • 選択したコードに必要な引数を自動で判断し、メソッドのパラメータとして設定
  • 戻り値の型を自動で推論(値を返す必要がある場合はreturn文も生成)
  • 適切なアクセス修飾子(privateなど)を設定
  • 元の場所にメソッド呼び出しを挿入
プロ太

手作業でメソッドを分割すると、引数や戻り値の設定でミスが起きやすいですが、Visual Studioに任せれば安心です!

メソッド抽出」は「処理のまとまりにわかりやすい名前をつける」という修正なので、実はこれも「良い名前をつける」というリファクタリングです。

「良い名前をつける」というのは、わかりやすいプログラムを書く上でとても重要なのです。

メソッドによる処理の部品化の意義・効果について、詳しくは以下の記事も参考にしてください。

C#入門編(7)クラス、メソッドによるコードの部品化 ~オブジェクト指向の土台を学ぶ~ C#入門編です。今回は、コードを部品化する演習を行います。 汚いコードを題材として用意して、そのコードを修正して綺麗にしながら、...

実践してみる

ここまで紹介した「名前の変更」と「メソッドの抽出」を、実際のコードで使ってみましょう。以下のコードは、価格に税率をかけて税込価格を計算しています。

class Program
{
    static void Main()
    {
        int x = 1000;
        int y = 10;
        int z = x * y / 100;
        int w = x + z;
        Console.WriteLine(w);
    }
}

このコードは動作しますが、変数名が不明瞭で何を計算しているのかが読み取れません。計算処理もMainメソッドに直接書かれています。

以下の手順でリファクタリングしてみましょう。

  • 手順1: 名前の変更(Rename)
  • 手順2: メソッドの抽出(Extract Method)

手順1:名前の変更(Rename)

xにカーソルを置いてF2を押し、priceに変更します。同様にytaxRateに、ztaxに、wtotalPriceに変更します。

class Program
{
    static void Main()
    {
        int price = 1000;
        int taxRate = 10;
        int tax = price * taxRate / 100;
        int totalPrice = price + tax;
        Console.WriteLine(totalPrice);
    }
}

これだけで「価格に税率をかけて税込価格を計算している」ということが伝わるようになりました。

手順2: メソッドの抽出(Extract Method)

税込価格を計算している部分(int taxRateからint totalPriceの行まで)を選択し、Ctrl+R, Ctrl+Mを押してメソッドとして抽出します。

メソッド名はCalculateTotalPriceとします。

class Program
{
    static void Main()
    {
        int price = 1000;
        int totalPrice = CalculateTotalPrice(price);
        Console.WriteLine(totalPrice);
    }
    
    static int CalculateTotalPrice(int price)
    {
        int taxRate = 10;
        int tax = price * taxRate / 100;
        return price + tax;
    }
}

Visual Studioがpriceを引数に、戻り値をint型に自動で判断し、return文や元の場所へのメソッド呼び出しも生成してくれています。

プロ美

x, y, z, wだと何の計算か全然わからなかったけど、リファクタリング後は税込価格の計算だってすぐわかるね!

プロ太

この演習のように、RenameとExtract Methodを組み合わせるだけで、コードの読みやすさが大きく変わります。

ぜひ自分のコードでも試してみてください!

まとめ

本記事では、Visual Studioの2大リファクタリング機能について解説しました。

名前の変更(Rename) — 識別子の名前をソリューション全体で安全に変更できる機能です。ショートカットキーはF2(もしくは、Ctrl+R, Ctrl+R)です。

変数名、メソッド名、クラス名を「意味の伝わる名前」に改善することで、コードの可読性が格段に向上します。

メソッドの抽出(Extract Method) — コードの一部を新しいメソッドとして切り出す機能です。ショートカットキーはCtrl+R, Ctrl+Mです。

長いメソッドを役割ごとに分割することで、コードが自己文書化され、保守しやすくなります。

次回は、Visual Studioが提案する「より良い書き方」への変換機能について紹介します。

varの活用、forからforeach、LINQへの変換などコードをモダンなC#に変換するリファクタリング機能を解説しますので、そちらもぜひご覧ください。

プロ太

リファクタリングの第一歩として、今日からRename、Extract methodをぜひ使ってみましょう

引き続き、一緒にC#やVisual Studioのリファクタリング機能について学んでいきましょう!

ABOUT ME
プロ太
ソフトウェア開発を楽しく、効率的に行う方法を追求しています。 開発者の視点から技術的課題に向き合い、「純粋な技術的興味に基づく探求」と「実践的な課題解決」という二つの柱を両輪として活動しています。