0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ミノ駆動本からストラテジーパターンを知った

Last updated at Posted at 2025-02-16

背景

ミノ駆動本を読む中でストラテジーパターンを知りました。interfaceの使い方についてDIと単体テストでモックのイメージしか持ててなく、ソフトウェア設計のパターンとしての使い方があることを知り、理解を深めるために自身で調べたことだったりまとめます。

ストラテジーパターン

概要

ソフトウェア設計におけるデザインパターンの一つで、アルゴリズムをカプセル化し、アルゴリズムの選択や切り替えを容易にする。

メリット

以下の理由から可読性および保守性が高まる

  • Swhich文を置き換えることができる
  • クラスによる責任が明確になり修正が容易になる

自分の理解

ストラテジーパターンを調べると↓のクラス図がでてくる。これは、どういう文脈(Context)で使うかに対して戦略(Strategy)を用意するがどうやって実現(Concreate)するかは選択可能。シーンによってやりたい事は同じだけどやり方は変わる時に有用。
例)会計するシーンでお金を払うけど現金・クレジット・QR決済と選択できる

実装例(C#)

ストラテジーインターフェースの作成

public interface IStrategy
{
    void Execute();
}

具体的なストラテジークラスの作成

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

public class ConcreteStrategyB : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Strategy B executed.");
    }
}
  1. コンテキストクラスの作成
public class Context
{
    private IStrategy _strategy;

    public Context(IStrategy strategy)
    {
        _strategy = strategy;
    }

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

    public void ExecuteStrategy()
    {
        _strategy.Execute();
    }
}
  1. 使用例
class Program
{
    static void Main(string[] args)
    {
        Context context = new Context(new ConcreteStrategyA());
        context.ExecuteStrategy(); // Output: Strategy A executed.

        context.SetStrategy(new ConcreteStrategyB());
        context.ExecuteStrategy(); // Output: Strategy B executed.
    }
}

デメリット

  • 採用することでクラスが増え、コードが複雑になる
  • 小規模なプロジェクトではかえって邪魔になる
  • ストラテジーパターンが使われていることに気づかず、処理が分散した時に予期しないバグが発生する

参照

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?