たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【C#】Template Methodパターンについて調べてみる

デザインパターンの一つ、Template Method パターンについて勉強してみました。一旦、Template Method パターンがどういうものか確認したあとで、何かしらの処理に使ってみます。

ja.wikipedia.org

Template Methodパターンとはなにか

Template Method パターン(テンプレート・メソッド・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。「振る舞いに関するパターン」に属する。Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せることである。そのため、システムのフレームワークを構築するための手段としてよく活用される。
#Wikipedia

自分の言葉で説明します。何かの処理をする時に初期化→なんらかのメイン処理→クリーンアップという一連の流れで処理することはそんなに珍しくいないことだと考えられます。この様に、頻繁に行われる処理の流れを抽象クラスで共通化して似たような処理は継承先にて各処理(初期化、クリーンアップ)の実装だけをしておけば、後は共通化した流れを呼び出すことで、その流れにそって処理を実行することができます。同じ流れであれば、使い回すことができます。

このように処理の流れをテンプレート化するものをTemplate Metho パターンといいます。(名前の由来はあってるのか確かではない)

クラスの役割と処理の流れ

f:id:c_taquna:20190219225602j:plain:w300
Wikipedia - Template Method パターンより -

この図の通り、抽象クラスを定義して、その中に一連の処理の流れを実装します。かつ、その一連の処理で実行されるメソッドは抽象メソッドとして定義しておき、継承先で実装します。例を見てみましょう。

抽象クラス

抽象クラスを定義します。

public abstract class AbstractTestClass
{
    protected abstract void Initialize();
    protected abstract void DoSomething();
    protected abstract void CleanUp();
    
    public void Run()
    {
        Initialize();
        DoSomething();
        CleanUp();
    }
}

ここは、最初に説明した一連の流れにおける各処理に該当します。継承先で実装します。

    protected abstract void Initialize();
    protected abstract void DoSomething();
    protected abstract void CleanUp();

これが、一連の処理の流れです。

    public void Run()
    {
        Initialize();
        DoSomething();
        CleanUp();
    }

各メソッドの実装

抽象クラスを継承して、各処理の実装を行います。とりあえず簡単に。

public class TestClass : AbstractTestClass
{
    protected override void Initialize()
    {
        Console.WriteLine("Initialize Mtthod");
    }

    protected override void DoSomething()
    {
        Console.WriteLine("DoSomething Method");
    }

    protected override void CleanUp()
    {
        Console.WriteLine("CleanUp Method");
    }
}

呼び出し

ここでは、上で書いたプログラムを呼び出しています。TestClass で実装した後に、TestClassのRun()メソッドを呼び出すことでTestClassで実装した処理をRun()の流れにそって実行しています。

class Program
{
    static void Main(string[] args)
    {
        AbstractTestClass atp= new TestClass ();
        atp.Run();
    }
}

TemplateMethodパターンは、この様に共通してる部分を括りだすという意味で、オブジェクト指向において、非常に標準的な再利用の方法です。

メリット / デメリット

次はメリット・デメリットについて考えてみます

メリット

  • 汎用的な処理の流れを抽象クラスで実装することで、機能の実装から切り離すことができる。そうすることで、処理の内容を変えるだけで多様な機能を実装できる

デメリット

  • クラスの数が多くなり、プログラムが肥大化してしまう。そうすることでプログラムが複雑化する恐れがある。

次の記事

Template Method パターンを使用してRESTAPIを実行するプログラムを書いてみます。