蚊帳の中の日記

ゆるく生きてます

TemplateMethodパターンについて少し勉強した

最近、良いサービス設計のためにどういったプラクティスがあるのか?、色々少しずつ勉強している。 今回は TemplateMethodパターンに少し弁甲したのでメモ

Templateと名前がついているのでなんとなく「テンプレートを使い回す用法なのかな」と思っていたが、勉強してみると思った通りの設計パターンだったと思う。

概要

テンプレートとなる抽象基底クラス(呼びづらいのでテンプレクラスと呼ぶことにする)と、それらテンプレートクラスを利用して具体的な処理内容を書く具象クラスに処理を分割して設計をする。 参考にしたURL *1 によると、

  • 処理の中で内容が変わらないものをテンプレクラスに書いて
  • 処理が場合によって変わるものを具象クラスに書く

例えば、ECサイトでMailerを実装するときに、問い合わせ先などがよく書かれているフッターなどはどのメールでも同じテンプレート情報としてまとめられそうなのでテンプレクラスに具体的な内容をまとめて、タイトルや本文は注文完了メールや発送完了メールなどメールの種類によって変わるので変わるものとして、具象クラスに具体的な内容をまとめられる。

自分はここを写経してイメージを掴んだ github.com

継承を使って、具象クラスはテンプレクラスのメソッドを必要に応じてオーバーライドする *2 。オーバーライドして具体的な処理内容を書くという感じ。これで、Templateとなるテンプレクラスを中心に、新しい具象クラスも追加しやすい。具象クラス内で必ずオーバーライドさせるようにしたい場合は、raiseさせたりして工夫する。

似たような処理があって微妙にcase文などを入れないと駄目なメソッドやクラスがあったら、型となる処理フロー(変わらない部分)と微妙に違う処理(変わる部分)に分けて設計するこのTemplateMethodパターンは有効とのこと。


メリットとしては、新しいパターンが増えても、テンプレクラスを継承した具象クラスを増やすだけで済むのでメンテナンス性が良くなることかなと思っている。比較的わかりやすくて、今後の実装に活かせそうな予感がしてる。一つの処理で分岐がたくさんあるけど、処理フローは変わらない、みたいなときに有効な気がしているので、そういったパターンが出たら使ってみようかな。

(今借りているリファクタリングRubyの後半にもTemplateMethodの話が少し載ってたので見てみよう)

*1:Rubyによるデザインパターン5原則 - Qiita

*2:このオーバーライドするべき(しなくても良い)メソッドをフックメソッドというらしい(railsのフックメソッドと混乱するからむしろ覚えないほうがいいかも)。まあ、とりあえずオーバーライドするメソッドたちと覚えておけば良さそう。