今日の勉強
- デザインパターン入門
- Template Methodパターン
スーパークラスで処理の流れを決めて、その中で行われる具体的な処理はサブクラスで決めるもの。
# template method pattern # xmltemplate class class XmlTemplate def display # 処理の流れだけを定義 puts header puts body # サブクラスでの実装が必要! puts footer end def header str = [] str << '<?xml version="1.0" encoding="utf-8"?>' str << '<model>' end def body raise "need implementation of body!" end def footer '</model>' end private :header, :print, :footer end # myxml class class MyXml < XmlTemplate def body str =<<EOF <sample>mybody</sample> EOF end end MyXml.new.display
これは実際に使ったことがある。ある4つの処理がほぼ同じ流れだったので、スーパークラスでその流れを規定して、具体的な処理はサブクラスで実装しました。
ただし、Template Methodの厄介な点は、スーパークラスの流れを知らなければ全く理解をできないということ。他の人の作ったTemplate Methodを利用する場合は、まずはその流れを把握することから始めなければならないので、とても大変です。自分が作ったTemplate Methodパターンはそうとも知らずに複雑なものにしてしまったため、後を継いだ人はたいへんだったでしょう(汗。
これからはクラスのコメントにTemplate Method Patternと書いておこう。