C#上級

上級 C#で学ぶリファクタリング|ケーススタディ編

導入

リファクタリングは、コードの内部構造を改善しつつ、外部の動作を変えないようにするプロセスです。特に大規模なプロジェクトでは、コードの可読性や保守性を高めることが求められます。本記事では、架空のプロジェクトを通じて、リファクタリングの実践的なアプローチを探ります。

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

重要な概念の整理

リファクタリングには、いくつかの基本的な概念があります。まず、重複コードの排除、メソッドの抽出、クラスの分割などが挙げられます。これらの手法を用いることで、コードの可読性を向上させ、バグの発生を抑えることが可能です。リファクタリングは、開発プロセスの一環として定期的に行うべき作業です。

コード例(C#)


public class OrderProcessor
{
    public void ProcessOrder(Order order)
    {
        if (order.IsValid())
        {
            NotifyCustomer(order);
            SaveOrder(order);
            GenerateInvoice(order);
        }
    }

    private void NotifyCustomer(Order order)
    {
        // 顧客への通知処理
    }

    private void SaveOrder(Order order)
    {
        // 注文の保存処理
    }

    private void GenerateInvoice(Order order)
    {
        // 請求書の生成処理
    }
}

コードの行ごとの解説

  1. クラス OrderProcessor は、注文処理のロジックを持つ。
  2. メソッド ProcessOrder では、注文が有効かどうかをチェックし、必要な処理を呼び出す。
  3. 各処理は、個別のメソッドとして実装されており、責任が分割されている。

ケーススタディ編

架空のEコマースプロジェクトにおいて、OrderProcessor クラスが複雑化してきました。新機能の追加やバグ修正が進む中で、コードが肥大化し、可読性が低下しています。この状況で、リファクタリングを行うことにしました。

まず、ProcessOrder メソッドを見直し、各処理を独立したクラスに分割します。これにより、各処理の責任が明確になり、テストも容易になります。例えば、顧客通知の処理を NotificationService クラスに移動させ、以下のように改善します。


public class NotificationService
{
    public void Notify(Order order)
    {
        // 顧客への通知処理
    }
}

public class OrderProcessor
{
    private NotificationService _notificationService;

    public OrderProcessor(NotificationService notificationService)
    {
        _notificationService = notificationService;
    }

    public void ProcessOrder(Order order)
    {
        if (order.IsValid())
        {
            _notificationService.Notify(order);
            SaveOrder(order);
            GenerateInvoice(order);
        }
    }
}

このリファクタリングにより、OrderProcessor クラスはシンプルになり、依存性の注入も実現しました。これにより、テストの際にモックを使用しやすくなります。

まとめ

  • リファクタリングは、コードの可読性と保守性を向上させる重要なプロセス。
  • 責任を明確に分割することで、コードのテストが容易になる。
  • 依存性の注入を活用することで、クラス間の結合度を低く保つことができる。