前回に引き続き「第2回:Project PhobosによるJavaScript with プレゼンテーション層」(SDC会員のみ)を寄稿しました。
ちょっとだけサマリを。
Phobos はサーバサイドでスクリプティング言語を利用しているWebアプリケーション・フレームワークです。Java EE 5のアプリケーションサーバ実装プロジェクトであるProject Glassfishの一部として、米サンマイクロシステムズのメンバーがオープンソースで開発を行なっています。
こいつのデプロイからサンプルの実行までが前半。そして、
では、従来のJavaEE開発との違いはなんでしょうか。これを考えるために今回のデモと同じ機能をWebアプリケーション・フレームワークのStrutsを使って作成してみました(ダウンロード)。ご存知の通りStrutsもMVCパターンを採用しています。Strutsの MVCは、コントローラー:Actionクラス、モデル:ActionFormクラス、ビュー:JSPファイルというようになっています。一方、 Phobosでは、コントローラー:コントローラーオブジェクトの関数、モデル:マップオブジェクト、ビュー:ejsファイルというようになります。同じような構造になっているため比較するのには都合がよいのです。
この議論の終着点はサイトを見てもらうとして技術的な話を1つ。Struts化した時に一番面白いと思ったのがTypeSafe Enumの使い方です。Phobosのサンプルは計算機なのですが、肝心の計算処理はJavaSciptで次のように書かれています。
value = ({ add: function(x,y) { return x+y; },
subtract: function(x,y) { return x-y; },
multiply: function(x,y) { return x*y; },
divide: function(x,y) { return y == 0 ? 0 : x/y; },
}[operator])(value, operand);
ようは関数をマップに登録して、計算子の名前で引っ張り出すというものです。
まずJavaScriptでマップは{キー:値,キー:値...}と書けます。この場合はaddというキーで、足し算をする無名関数(function(x,y) { return x+y; })を登録しています。このマップから値を取り出しているのが[operator]の部分です。operatorは、画面から上がってくる文字列で、"add"、"subtract"などです。
例えば"add"という文字列が渡されるとマップからは足し算の無名関数が取得されます。で、そいつを(value, operand)で呼び出すと。実践的かどうかには疑問はありますが、JavaScriptの仕様を使ったうまい書き方です。
で、それをStrutsで書き直すときにTypeSafe Enumを使うと
interface Calculate {
public int exec(int x, int y);
}
static enum CALCULATOR implements Calculate {
add { public int exec(int x, int y) { return x + y; } },
subtract { public int exec(int x, int y) { return x - y; } },
multiply { public int exec(int x, int y) { return x * y; } },
divide { public int exec(int x, int y) { return y == 0 ? 0 : x / y; } }
};
public ActionForward execute(ActionMapping mapping, ActionForm ... {
...
value = CALCULATOR.valueOf(operator).exec(value, operand);
というわけで、Javaでも同じような書き方ができちゃいます。valueOfでNullが帰ってくるとヌルポになるので実践的とはいいませんが、そこだけケアすれば使えるテクニックだと思います。TypeSafe Enumはインターフェースが実装できるのは、けっこう便利ですね。TypeSafe Enumの詳しい説明くはJ2SE 5.0 Tiger 虎の穴 Typesafe Enumで。というわけで、TypeSafe Enumはもっと使いましょう。
