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?

Pythonで実装するTemplate Methodパターン:アルゴリズムの枠組みを固定し、詳細は委ねる

Posted at

概要

Template Method(テンプレートメソッド)パターンは、
アルゴリズムの骨格(流れ)を親クラスで固定しつつ、詳細な処理はサブクラスに委ねる設計パターンである。

処理手順の共通化と、変化する処理のカスタマイズを両立でき、「流れは変えずに中身だけ差し替えたい」ような状況に最適な構造を提供する。


1. なぜTemplate Methodが必要か?

❌ すべての処理がサブクラス任せだと、一貫した手順を保証できない

class Task:
    def execute(self):
        self.step1()
        self.step2()
        self.step3()

→ 各サブクラスが execute() をオーバーライドすると、全体の手順が崩れる可能性がある


✅ アルゴリズムの流れはスーパークラスで確定し、変化する部分だけを抽象化

class Task:
    def execute(self):
        self.load_data()
        self.process()
        self.save_results()

フレームワークとして手順を提供し、カスタマイズポイントを明示できる


2. 基本構造

✅ 抽象クラスにテンプレートメソッドを定義

class AbstractTask:
    def execute(self):
        self.load_data()
        self.process()
        self.save_results()

    def load_data(self):
        raise NotImplementedError

    def process(self):
        raise NotImplementedError

    def save_results(self):
        raise NotImplementedError

✅ サブクラスで具体的な処理を実装

class CSVTask(AbstractTask):
    def load_data(self):
        print("CSVファイルからデータを読み込む")

    def process(self):
        print("データを正規化する")

    def save_results(self):
        print("結果をCSVに保存する")

class DBTask(AbstractTask):
    def load_data(self):
        print("データベースからデータを読み込む")

    def process(self):
        print("データを集計する")

    def save_results(self):
        print("結果をDBに書き戻す")

✅ 使用例

task = CSVTask()
task.execute()

task = DBTask()
task.execute()

出力:

CSVファイルからデータを読み込む  
データを正規化する  
結果をCSVに保存する  
データベースからデータを読み込む  
データを集計する  
結果をDBに書き戻す

3. Python的応用:フックメソッドの活用とスーパークラスの共通処理

class AbstractTask:
    def execute(self):
        self.before()
        self.process()
        self.after()

    def before(self):
        print("[共通] 処理開始ログ")

    def after(self):
        print("[共通] 処理完了ログ")

    def process(self):
        raise NotImplementedError

共通処理を before / after にまとめ、カスタムは process() に限定


4. 実務ユースケース

✅ データETL処理(Extract → Transform → Load)

→ 各処理の手順は同じでも、抽出元・変換方法・保存先が異なる


✅ Webリクエスト処理フロー(認証 → 処理 → ログ)

全体の流れは同じで、リクエスト内容に応じた処理だけ変更


✅ テストケースの実行フロー

setup → execute → teardown の流れを定義し、中身はサブクラスで定義


✅ 機械学習パイプライン(前処理 → 学習 → 評価)

→ 流れを一定に保ちつつ、モデル・評価指標などを切り替え可能


5. よくある誤用と対策

❌ サブクラスでテンプレートメソッドそのものを上書きしてしまう

→ ✅ テンプレートメソッドには明確に final 的な意味合いを持たせる


❌ オーバーライド前提のメソッドがドキュメントに明記されていない

→ ✅ abstractmethod や明確なコメントでカスタムポイントを示す


❌ フックメソッドの呼び出し忘れや順序ミス

→ ✅ テンプレートメソッドは必ずスーパークラスで責任を持って構成する


結語

Template Methodパターンとは、“流れを制御し、詳細は委ねる設計”である。

  • アルゴリズムの骨格は親クラスに置き、処理のカスタマイズポイントを明確に分離
  • 手順の誤用を防ぎながら、共通フローと差異の両立を実現する
  • Pythonでは継承・抽象メソッドを用いて、自然にこの構造を表現可能

Pythonicとは、“流れを守りつつ、変化に寛容であること”。
Template Methodパターンはその秩序の知性を、設計の拡張性として定義する技法である。

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?