Logic-less templateに関する覚書

(This entry is a summary of the conversation to @confound and @miyagawa and the paper of ESMVSTE)

@confound氏に「Xslateでpush-style template syntaxをサポートしてはどうか」といわれたので、彼やmiyagawaさんからアドバイスをもらいつつ考えたことのまとめ。ESMVSTE(Enforcing Strict ModelView Separation in Template Engines)の内容もまじってます。

  • HTML::Templateやmustacheのようなlogic-less templateをpush-style template*1という。これは、必要な計算(logic)をすべて終えたあとにテンプレートにデータを「押しこむ」ことによる。
  • 逆に、TTやKolonはpull-style templateという。これは、テンプレート内で、モデルからデータを「引いてくる」ことから。
  • push-styleのほうがMVCのモデルとビューの分離が明確なのでよい
  • 分離のメリットは以下の通り*2
    • カプセル化(encapsulation): ビジネスロジックをモデルにカプセル化する
    • 明確(clarity) - テンプレートがHTMLそのものになるので読みやすい
    • 役割分担(division of labor): デザイナーと協働しやすい
    • コンポーネントの再利用(component reuse): 大きなメソッドを分割するように、テンプレートをナビゲーションや検索窓などに分割することで再利用を促進できる
    • 変更箇所を一箇所に(single-point-of-change): テンプレートを適切に分割することで、変更箇所を最小にできる
    • メンテナンス(maintenance): テンプレートの修正はプログラムの修正より安全であり、プロセスの再起動も不要である
    • ビューの交換(interchangeable views): サイトの外観を簡単に交換できる
    • 安全性(security): ユーザーがカスタマイズ可能なblogなどでは制限のないテンプレートは危険である

Xslateはeval()等の危険なことはしていない*3ので、運用次第では上記のビューの分離のメリットはすべて享受することができます。ただ「運用次第では」というところが微妙なので、ひとつくらいはpush-style templateをサポートしてもいいでしょう。

*1:または「push strategyを採用したテンプレート」でもいい。

*2:ESMVSTEより。これらはテンプレート一般の話でpush/pullに限らない?

*3:PPバージョンではevalしますが。