こんにちは。小西です。
今回はPlay1とPlay2のテンプレートについて考察してみようと思います。
有志の方が翻訳してくれているのでPlay2についても日本語ドキュメントが徐々に揃いつつあり、最近では情報収集も大文楽になりました。
<とりあえず比較>
私的に両者の違いをまとめると以下のようになります。
Play1
- Groovyベース
- 宣言なしで任意の数のパラメータを渡すことができる
- その代わりパラメータは一度ローカル変数に代入しなければならない
- 不正なパラメータ名はNullオブジェクトとして扱われエラーにならない
- マジックワードは複数を使い分け(変数は「&」、タグは「#」、スクリプトは「%」など)
- カスタムタグをJavaまたはテンプレートで作成可能
- テンプレート内で使用するJavaオブジェクトを拡張できる(Stringにrawメソッドを追加など)
Play2
- Scalaベース
- パラメータの宣言が必要
- デフォルト引数やパラメータの名前渡しが可能(Scala標準機能)
- リテラルや関数を直接パラメータに渡せる(どちらかというとできないPlay1の方がトリッキー)
- 不正なパラメータ名はコンパイルエラー
- マジックワードは「@」のみ
- Play1との対比で言えば「%(スクリプト)」相当
- 「@param」のような使い方ができるのは、ブロックの中の最後の行が戻り値となるScalaの言語仕様から
- カスタムタグ相当のものはない
- なぜなら「@」だけで同じことができるから
- Javaオブジェクト拡張はない
- なぜならScalaには「implicit関数」があるので最初から同じことができるから
いかがでしょう?
僕はこの二つのリストから機能よりもむしろむしろPlay開発者の意図の違いのようなものを感じます。
どういうことかというと、
- Play1では、利用者の利便性を図るために多くの機能が作りこまれている
- Play2では、Scalaのパワーを活用するために意図的に独自機能を盛り込んでいない
というような違いがあるように感じるのです。
あるいは、Javaの頃は色々と作りこまないと不便だったのがScalaにするとそんなことする必要がなくなったということかもしれません。
<Play2テンプレート>
Play2のテンプレートはほとんどScalaそのものであり、実際にscalaファイルに変換されてコンパイルされます。
ちなみに変換されたscalaファイルは「target/scala-x.x.x/src_managed」の下にあります。
(今回はとりあげませんがroutesファイルも変換されてここに置かれます。つまりroutesファイルもScalaです。)
生成されたメソッドの中身がどういうものであるかはこの際どうでも良いんですが、以下のことをチェックしておくとテンプレートの動作が理解しやすいと思います。
- ファイル名に対応する名前でobjectが生成されている
- そのapplyメソッドとして自分の宣言したパラメータをとり、HTMLを返すメソッドが生成されている
- 「views.html._」がimportされている
要するにテンプレートの実行やその中で行っている処理は通常のScalaコード以外の何者でもないということです。
<Play2テンプレートの注意点>
さて、上に書いたようなことは別に知らなくても良いことではあるんですが、何故それを書いたかというとPlay2のテンプレートにはちょっとした問題点があるからです。
それが何かというと。。。。
実はPlay2ではこんなテンプレートは書けません。
{
はい。開き中括弧がひとつあるだけです。
Play2のテンプレートでは中に中括弧が含まれているとそれがどのような形であれ整合していない場合はエラーになります。
これはおそらく外部からパラメータとして渡す以外に回避する方法はありません。試した限り「""」で文字列として括っても一度変数に代入してもどうやってもエラーになりました。
まぁ整合しない中括弧が書けなくても実用上は特に問題はないですけれど、個人的にはこれはバグだと思っています。
<まとめ>
以上、ちょっと偏った視点からですがPlay1とPlay2のテンプレートについて考察してみました。
こうしてみるとPlay2のテンプレートは良く考えられていると思うし非常に面白いです。
しかし実際に使うとなるとPlay1のテンプレートの方が使いやすいと感じています。
何故そう思うんだろう?と考えてみたところどうも意識の差が大きいようです。
Play1の場合は「テキストを書いている」という気分で書けるのに対して、Play2の場合はどこまでも「Scalaを書いている」という気がします。まぁ僕だけかもしれませんけど。
中括弧の問題もJavaScriptを書く際にはちょっと気になります。(実際にはむしろバグの検出タイミングは早くなるはずなんですけどね。。。)
ここまで書いておいて何ですが、どれだけテンプレートエンジンが高機能でもテンプレートには可能な限りロジックは持ち込まない、ということが一番重要だよなと改めて感じました。
テンプレートは開発者以外の人がメンテすることもありますし。
まとめると
- Play2のテンプレートは思わず語りたくなっちゃう程面白い
- しかし実際に使いたいかどうかは話は別
- 個人的にはテキスト気分で書けるPlay1の方が楽
- それだけ見て何やってるかわからないようなテンプレートは書いちゃ駄目
という感じですかね。
それでは、また。
次回はコントローラの比較をやります。