Velocity

Velocityについて

コミュニティ

ドキュメント

比較

ツール

日本語訳について

Velocity と WebMacro との違い

メーリングリストで Velocity と WebMacro の違いを説明して欲しいと言われることがよくあります。 何度も同じ問題に答える代わりに、アプローチの違いの一部を説明するためにこの文書を用意しました。 実はどちらも優れたツールなので、どちらを使うか決めるのは、 ユーザの皆さん次第だと思っています。

言語構文はかなり似ていますが厳密には同じではありません。 構文を似たようなものにしたのは以下の理由からです。

1) リファレンスで $<foo>を使い、指示子で #<bar> を使うという、 構文に関するアプローチは優れています。デザイナが使いやすく、 誰でも理解できますし、新しい構文をわざわざ作り直す理由もありませんでした。

2) 多くの人々がこの構文を使っているのに、なぜ新しい構文を考え出す必要があるでしょう? それに WebMacro から Velocity への変換が簡単にできます :) そのためのツールもあります。

Velocity は、新たに一から構築されました。[WebMacroと] 共有するコードはありません。 このようにした本来の理由は、WebMacro が BSD/ASF ライセンスと互換性を持たないライセンス (GPL) でリリースされており、我々 (オリジナルの作者) には GPL ライセンスでないソリューションが必要だったからです。 その後、WebMacro は GPL/ASF の両方のライセンスでリリースされましたが手遅れでした。 プロジェクトはすでに軌道に乗っていましたし、 自分でコードを書くよりも[JavaCCで]生成されたパーサを使う方が、 技術的な解決策としては適切だと思ったからです。

新規に開発したので、 WebMacro が後方互換の問題のせいで扱わざるをえない厄介な問題に、 我々はあまり関わずに済んでいます。 我々は、WebMacro に紛れ込んだいくつかのテンプレート言語としての不整合を修正しました。 その中には、コードブロックで { } をサポートしないこと (Velocity では不要です)や、 # 指示子 の右側で丸括弧を使用することなどがあります。例をあげましょう。

#set ($bar = "foo")

#if ($bar.length() > 0)
stuff here
#end

アーキテクチャ的には、最近までの大きな違いはパーサでした。 Velocity パーサは、javaCC(非常に人気がある Java ベースのパーサ/ジェネレータ) というツールを使用して書かれます。 それは、元々は Metamata が Sun のために開発したもので、 保守や管理も Metamata が行っています。
[訳注:上記のサイトは現在存在していません。保守・管理に関しては、現在ではjava.net 内のコミュニティが行っています。]

WebMacro パーサは最近まで手で書かれていたため、(それによる多くのバグのせいで) WebMacro を使う際には多くの苦労がありました。0.95 のリリースの新しいパーサは、 javaCCを使って書かれておりきっと改善されたことでしょう (とはいえ、多くの過去の遺物へのサポートは残っています) 。

Velocityのアーキテクチャは極めて単純で、テンプレートエンジン以外の何物でもありません。 その考え方は、ひとつのことだけをちゃんと行うということです。 そうした考え方は Unix の思想に多く見られます -- つまり単純なツールを適切に集めて、 それを元により大きいものを作るということです。 これが、Velocity が AnakiaTexen など様々なツールのベースとして使われるようになった理由です。

Velocity を「開発フレームワーク」にするつもりはありません -- すでにそういったものはたくさんあります。例えば Turbine がそうです。

したがって、「コンテキストツール」や「リソースブローカ」といった 機能は全て Velocity からわざと外しています。 そういったことはフレームワークが行うでしょうし、 その方がとにかく適切だと認識しているからです。 さらに、アプリケーション/ユーザ/フレームワークのレベルで行うべきことの多くを Velocity コアから外すことによって、 Velocity コアを小さいままにしておけますし、 それによって、(あくまで我々の意見ですが)メンテナンスや拡張がしやすくなります。

内部的には Velocity はかなり単純です。ユーザ向けのスレッドは生成も管理も行いません。 テンプレートは解析され、内部では「抽象構文木」形式となるキャッシュとして保持されます。 この形式は樹状構造となっており、テンプレートがマージされた時に高速に処理できます。 個々のノードはテンプレート内の構文要素のどれか一つに対応しています。

WebMacro の内部では、処理を高速にするためにメソッドやクラスの多くは private や final、あるいはその両方になっています。しかし、その結果、 ユーザがコア機能を容易に拡張/オーバーライドしたり、 コードの一部を再利用するのが難しくなりました。 我々は、ソフトウェアが使いやすくなるのなら、 数ミリ秒の処理速度なら犠牲にしても構わないと思っています。

機能における両者のもっとも大きな違いは「Velocimacro」です。 Velocimacro は、何でも入れられる再利用可能データの断片群と考えてよいでしょう。 #parse() ステートメント内のデータと同じように、Velocimacroは解析され、 そしてVelocimacro 内であれば任意のスコープで変数を扱うことができます。

また、Velocimacro のおかげで、コアの # 指示子は少数で整理された状態を維持できます。 言い換えれば、WebMacro は、コアに # 指示子をどんどん追加していますが、 我々はそうではありません。そうした共有可能な「特別な」機能については、 オプションのダウンロードとしてサポートしたいと思います。

この文書がお役に立てばと思います。とはいえ、Velocity を理解する一番の方法は、 それを使ってみることです。もちろん、ソースコードを見るのに勝るものはありません。



このドキュメントは、 熊坂祐二 、 高橋達男 が訳しました。
コメントがある場合は、 report@jajakarta.org までお願いします。
オリジナル英文 Copyright © 1999-2003, The Apache Software Foundation