ビューにおける《分岐処理》

「Webアプリケーションにおけるビューとモデルの分離」について方々で言及されるようになってから久しい。
実際、それを謳ったライブラリやフレームワークが増えているのだが(というか最近は当たり前とされてる)、それらのビュー部分の仕様には《分岐処理》を実現するための仕組みが組み込まれていることが多い。
私にはこれがちょっと不満なのである。
JSPスクリプトレットを入れるのは避けましょう」と言っておきながらJSPJSTLには<c:if>があるし、「JavaコードをHTMLテンプレートから切り離すことにより、MVCスタイルの開発を強制することができます」と言っておきながらVelocityのテンプレートには#ifがある。

でも、JSTLやテンプレートにとって《分岐処理》は本当に必要なものなのだろうか?
「ビューとモデルの分離」とは「表現と論理の分離」のことであり、《分岐処理》は「表現」ではなく「論理を実現するためのプロセス」に属するものなのではないのだろうか?

Velocityのドキュメントには、

Velocity allows web page designers to embed simple yet powerful script elements in their web pages.
(訳)
Webページのデザイナーが、単純だが強力なスクリプト要素をWebページに埋め込むことができる。

と書いてあるので、テンプレートにプロセスが入り込むのは全然構わないらしい。
Velocityにおける「ビューとモデルの分離」は「デザイナーと開発者の分離」を意味しているようである。
テンプレートにある《分岐処理》は、あくまでも「デザインのために用意したもの」というスタンスなのだろう。
また、理屈でどうこう言う以前に「開発の効率性(≒ビジネスとしての有用性)」を考えればこれで十分であるという認識なのかもしれない。

ただ、「ビューとモデルの分離」という言葉は、しばしば「システムを構成する他の要素に影響を与えずに、特定の要素の中身(実装)を変更することが出来る」という文脈の上に現れるが、このときのこの言葉は単に「デザイナーと開発者の分離」という意味ではないだろう。

個人的には「ビューはモデルから渡されたデータを、環境に相応しい形で表現するものであり、それ以外の責務は負わない」というのが「ビューとモデルの分離」のあるべき姿のような感じがする。
(ここで言う「環境」とは、「XMLかPDFか?」とか「アラビア語か日本語か?」とか「法定帳票なのか分析資料なのか?」といった、複数の異なるレベルの条件が組み合わさったもののことである)
要は、ビューでは「データをフォーマットする」「フォーマットされたデータを出力の構造に埋め込む」ということ以外はやるべきではないということである。
JSPやテンプレートはあくまでも「出力の構造」であり、ここには《分岐処理》は必要ない。
条件によって構造が変わるのであればコントローラー側でハンドリングすれば良いのだし、構造の小さな差異による類似ファイルの増加が嫌なのであればJSPやテンプレートを入れ子にすれば良い。
もちろん、「データをフォーマットする」際には環境に応じて分岐する必要があるが、これは構造とは切り離された部分で実行されるべきものである。
例としてJSPのケースを挙げると「カスタムタグの内部でフォーマッタを呼び出し、それを貼り付けるJSP自体には《分岐処理》を入れない(=JSPで分岐を行なうカスタムタグを使わない)」ということである。
上記のようにビューが「データのフォーマット」と「出力の構造へのマージ」という役割に徹し、出力の構造から《分岐処理》を排除すると、ビューをまるごと別の形式に変更する必要が生じた場合でも対応が容易になる。

ここまでの話を読むと2点ほど疑問が浮かぶかもしれない(突っ込みどころ満載なので人によってはもっと沢山浮かぶのだろうが)。
「《反復処理》はどうなの?」と「それってXMLXSLTで変換して表示するのと同じじゃないの?」というものである。

まず、「《反復処理》はどうなの?」についてであるが、《反復処理》の使用については問題ないと考える。
テーブル形式のデータ構造が存在する場合、それを反復して出力構造に流し込むというのはデータのマッピング方法として妥当な形であろう。
排除したいのはあくまでも「プロセス」的な部分である。

次に、「それってXMLXSLTで変換して表示するのと同じじゃないの?」についてであるが、これは半分だけ正解である。
汎用的なデータ構造だけをビューに渡し、それを然るべき形に整形するというのは、XMLXSLTを使ったビューそのものである。
ただ、個人的にはXMLはWebのビュー部分に使用するのに少々オーバースペックではないかと思う。単にツリー構造で保持されたデータをテンプレートに貼り付ける機能があれば良いはずである。
また、「半分だけ正解」という中途半端な言い方をしているのは、XSLTにも《分岐処理》があるためである。
この点については、XMLとVelocityとで事情が似ているかもしれない。
どちらも「Webアプリケーションのビュー」ではなく、もっと高度な機能を実現するものであるため、仕様的に制御構文が必要なのであろう。

つまるところ、XMLやVelocityが仕様的に《分岐処理》の機構を持つこと自体は妥当であるが、それらを「Webアプリケーションのビュー」として利用する際には、開発者側で《分岐処理》を使わないようにするべきである。
また、「Webアプリケーションのビュー」としてのみ存在意義を持つJSPについては、《分岐処理》の機構を持つこと自体が妥当ではない。本来はそれらを排除した仕様であるべきだが、現状では開発者側で《分岐処理》を使わないという方針で対処するべきである。