C#中級

中級 C#で学ぶリファクタリング|解説編

導入

リファクタリングは、既存のコードを改善し、可読性や保守性を向上させるためのプロセスです。特に中級エンジニアにとって、リファクタリングのスキルは非常に重要です。この記事では、C#を用いた具体的なリファクタリングのケーススタディを通じて、実務に役立つ視点を提供します。

教科書レベルの解説(リファクタリング)

重要な概念の整理

リファクタリングにはいくつかの基本的な概念があります。まず、リファクタリングは「動作を変えずにコードを改善する」ことを目的とします。これにより、バグのリスクを減少させ、将来的な機能追加や修正を容易にします。また、リファクタリングには、メソッドの抽出、クラスの分割、命名規則の見直しなど、さまざまな手法が存在します。

コード例(C#)


public class Order
{
    public double CalculateTotal(double price, int quantity, double discount)
    {
        double total = price * quantity;
        total -= total * discount;
        return total;
    }
}

コードの行ごとの解説

  1. メソッド名が具体的でないため、何を計算しているのかがわかりにくい。
  2. 引数の数が多く、メソッドの責務が不明瞭になっている。
  3. ディスカウントの計算が直感的でないため、可読性が低い。

解説編

上記のコード例では、注文の合計金額を計算するメソッドが示されていますが、リファクタリングの余地があります。まず、メソッド名をより具体的に変更し、引数をオブジェクトにまとめることで、メソッドの責務を明確にします。次に、ディスカウント計算を別のメソッドに抽出し、テスト可能性と再利用性を向上させます。

以下にリファクタリング後のコードを示します。


public class Order
{
    public double CalculateTotal(OrderDetails details)
    {
        double total = details.Price * details.Quantity;
        total -= CalculateDiscount(total, details.Discount);
        return total;
    }

    private double CalculateDiscount(double total, double discount)
    {
        return total * discount;
    }
}

public class OrderDetails
{
    public double Price { get; set; }
    public int Quantity { get; set; }
    public double Discount { get; set; }
}

このように、リファクタリングを通じてコードの明確さと保守性が向上しました。特に、引数をオブジェクトにまとめることで、メソッドの呼び出しが直感的になり、他の開発者が理解しやすくなります。

まとめ

  • リファクタリングは、既存のコードを改善し、可読性と保守性を向上させるための重要なプロセスである。
  • 具体的なケーススタディを通じて、実務に役立つリファクタリング手法を学ぶことができる。
  • メソッドの責務を明確にし、引数を整理することで、コードの理解が容易になる。