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?

More than 3 years have passed since last update.

Template Method (継承)の採用可否基準

Last updated at Posted at 2021-09-23
関連記事のトップページ
[シリーズ] Python におけるデザインパターンの記録

概要

基底クラスを継承をした構造 (Template Method) の「採用可否の基準」と「実装例」.
引用元は下記書籍である.

ただし、内容について細かく記すと書籍の無断転載になるので大まかに記している.
また、コードは Ruby から Python に書き換えている.

引用元情報 一言
書籍 -- Rubyによるデザインパターン (Russ Olsen 著) 原書(英文)
GitHub -- 著者 Russ Olsen 氏

採用の基準

ここは独断もしくは私の解釈です.

採用基準は次を満すこと.
基底クラスの仕様がルーチンレベルまで確定していること

言い換えると次である.
FactoryMethod 以上に基底クラスの大半を継承できる状態にあること

個人的感想

Template Method が適用できるほど綺麗に設計する自信が無いので、ほとんど使用したことが無い.
普段は、もう少し "緩い" Factory Method を使用している.

私としては、相当枯れた処理に対するリファクタリング用途にしか Template Method が適用できない...

書籍で頻繁に目にする「文字列を HTML や XML, PlainText で装飾して出力する」ような
簡単な実装は業務では遭遇しない. (最初はこのような要求でも、後から機能拡張要求が来てしまう)

追記

リファクタリングを実施した際に、親・子クラスを作ったことで、
結果的に Template Method が実現できていることは多々あった.

下記より、どうやらリファクタリングの過程で Template Method を実現することは妥当な模様.

Rubyによるデザインパターン (Russ Olsen 著)』 を見たところ、
TemplateMethod パターンはリファクタリングさせながら完成させれば良い
といった旨の記載があった.

コード例

過去に次のような「検査」処理を実装してみたが、共通部の実装が難しく苦戦した.

from abc import ABCMeta, abstractmethod

class Inspector:
  @abstractmethod
  def __init__(self):
    初期化処理は具象クラスごとに異なる.

  def prepare(self, *args, **kwargs):
    全ての具象クラスで使用できる共通の準備処理.

  @abstractmethod
  def execute(self, *args, **kwargs):
    具象クラスごとに異なる検査処理.

  def reflect(self, *args, **kwargs):
    全ての具象クラスで使用できる共通の結果記入処理.

以上.

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?