関連記事のトップページ |
---|
[シリーズ] 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):
全ての具象クラスで使用できる共通の「結果記入」処理.
以上.