今日の勉強

スーパークラスで処理の流れを決めて、その中で行われる具体的な処理はサブクラスで決めるもの。
# 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と書いておこう。