C#中級

中級 C#で学ぶリファクタリング|アンチパターン編

導入

リファクタリングは、コードの可読性や保守性を向上させるための重要なプロセスです。しかし、実際の業務においては、リファクタリングを行う際に陥りやすいアンチパターンが存在します。本稿では、C#を用いた具体的なシチュエーションを通じて、よく見られる失敗例とその改善策について考察します。

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

重要な概念の整理

リファクタリングは、既存のコードを改善するために行われる手法であり、主に以下の目的があります。

  • 可読性の向上
  • バグの削減
  • 保守性の向上
  • パフォーマンスの改善

リファクタリングを行う際には、これらの目的を意識しつつ、コードの設計や構造を見直すことが求められます。

コード例(C#)


// 複雑な条件分岐を持つメソッド
public string GetDiscountedPrice(int customerType, double price)
{
    if (customerType == 1) // 新規顧客
    {
        return (price * 0.9).ToString("C");
    }
    else if (customerType == 2) // リピーター
    {
        return (price * 0.85).ToString("C");
    }
    else if (customerType == 3) // VIP顧客
    {
        return (price * 0.8).ToString("C");
    }
    else
    {
        return price.ToString("C"); // 通常価格
    }
}

コードの行ごとの解説

  1. メソッド名は、目的を明確に示すものの、条件分岐の複雑さが可読性を損なっている。
  2. 顧客タイプの条件分岐が増えると、メソッドの変更が難しくなる。
  3. 価格の計算ロジックがメソッド内に埋め込まれているため、テストや再利用が困難。

アンチパターン編

上記のコード例には、条件分岐が多く含まれており、これは「条件分岐のスパゲティ」と呼ばれるアンチパターンです。このパターンは、将来的に顧客タイプが増えた場合に対応しづらくなるリスクがあります。改善策としては、以下のようなアプローチが考えられます。

  • 顧客タイプごとの割引計算を別のクラスやメソッドに分けることで、単一責任の原則を遵守する。
  • 戦略パターンを使用し、顧客タイプごとの割引計算をオブジェクトとして扱うことで、拡張性を持たせる。

まとめ

  • リファクタリングの目的を理解し、コードの改善に取り組むことが重要。
  • 条件分岐のスパゲティを避けるために、設計の見直しやパターンの適用を考慮する。
  • リファクタリングは継続的なプロセスであり、定期的な見直しが必要である。