C#中級

中級 C#で学ぶデザインパターン|練習問題編

導入

デザインパターンは、ソフトウェア開発において再利用可能な解決策を提供します。特にC#のようなオブジェクト指向プログラミング言語では、デザインパターンを適用することで、コードの可読性や保守性が大幅に向上します。今回は、実務で遭遇しやすい具体的なシチュエーションを通じて、デザインパターンの理解を深めます。

教科書レベルの解説(デザインパターン)

重要な概念の整理

今回注目するデザインパターンは「ストラテジーパターン」です。このパターンは、アルゴリズムをクラスとしてカプセル化し、それを動的に切り替えることを可能にします。例えば、異なる種類のデータを処理する際に、処理方法を柔軟に変更したい場合に非常に有効です。

コード例(C#)


using System;

public interface IStrategy
{
    void Execute(string data);
}

public class ConcreteStrategyA : IStrategy
{
    public void Execute(string data)
    {
        Console.WriteLine("Strategy A: " + data);
    }
}

public class ConcreteStrategyB : IStrategy
{
    public void Execute(string data)
    {
        Console.WriteLine("Strategy B: " + data);
    }
}

public class Context
{
    private IStrategy _strategy;

    public void SetStrategy(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public void ExecuteStrategy(string data)
    {
        _strategy.Execute(data);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Context context = new Context();

        context.SetStrategy(new ConcreteStrategyA());
        context.ExecuteStrategy("Hello, World!");

        context.SetStrategy(new ConcreteStrategyB());
        context.ExecuteStrategy("Hello, Design Patterns!");
    }
}

コードの行ごとの解説

  1. インターフェースIStrategyを定義し、Executeメソッドを宣言します。
  2. ConcreteStrategyAとConcreteStrategyBで、IStrategyを実装し、それぞれ異なる処理を行います。
  3. Contextクラスでは、IStrategyを保持し、SetStrategyメソッドで戦略を設定します。
  4. ExecuteStrategyメソッドを通じて、設定された戦略のExecuteメソッドを呼び出します。
  5. Mainメソッドでは、Contextインスタンスを作成し、異なる戦略を設定して実行します。

練習問題編

以下の練習問題に挑戦し、ストラテジーパターンの理解を深めてください。

  1. 問題 1: ストラテジーパターンを用いて、異なるログ出力方法(コンソール、ファイル、データベース)を実装してください。

    模範解答: 各ログ出力方法を実装したクラスを作成し、Contextクラスを用いて動的に切り替えます。

  2. 問題 2: ストラテジーパターンを利用して、異なる割引計算(固定、パーセンテージ)を行うクラスを作成してください。

    模範解答: 割引計算の異なるアルゴリズムを実装したクラスを作り、Contextクラスで切り替えます。

  3. 問題 3: ストラテジーパターンを使って、異なるデータベース接続方法(SQL、NoSQL)を実装してください。

    模範解答: 各データベース接続方法を実装したクラスを作成し、Contextクラスで動的に切り替えます。

まとめ

  • ストラテジーパターンは、異なるアルゴリズムを動的に切り替えるのに役立ちます。
  • 実務での適用例として、ログ出力や割引計算、データベース接続などがあります。
  • 具体的なシチュエーションに応じて、柔軟に設計を変更することが可能です。