どうもマコピーです。名ばかり、です。
Nephiaというウェブフレームワークを@ytnobodyさんを中心にHachioji.pmの方々とで作っているというのは以前の記事で話題に出したのですが、なんか最近方向性がはっきりしてきたというか、そろそろユーザがほしいので一言。
Perlに限らずウェブアプリケーションを作るためのフレームワークというのは世の中にたくさんあります。そして、プログラミング言語が備える、もしくは後付された思想と同じように、フレームワークにもエコシステムが生まれるのでそれぞれ思想があります。
例えばRuby on RailsはDRY(記述を繰り返さない)、設定より規約等々。。。
SinatraやFlaskはマイクロフレームワーク、彼らはマイクロが故にRoRなどのフルスタックなフレームワークが標準で備えるORMは添付されず、勝手にやってくれという思想です。
Nephiaの思想とは何か。
一言で言ってしまえば「ゆるふわ」だと僕は思っています。
例えばPODのコードなんですけれど、一部を「Nephia風」に書き換えたものを示します。
path '/foobar' => sub { my $req = req; return { name => 'MyApp', query => $req->param('q'), }; };
書き換えたところは本来は引数で$reqを取るところをreqという関数を用いて取得しています。このあたりがゆるふわ。
僕が定義するここでのゆるふわとは
「よしなにやってくれて、Perlのコンテキストを知らずに使える女子力高めのDSL」
です。
my $req = shift;となんら変わらないんですけれど、引数としてcoderefにRequestオブジェクトが渡ってくるっていうのは、いわゆる標準的なPerlでありがちな慣習であって、それは「覚えておかないこと」だと僕は思うんですね。
これがreqというDSLでどう変わるか。それは覚えるものから、身に付けるものに変わると僕は思います。指が覚えてる、体が覚えている、それぐらい簡単にウェブアプリケーションを書きたい。そういう要望から、ゆるふわな感じのDSLがNephiaにはデザインされて組み込まれています。
さらに、開発者それぞれの「こういうふうだったら、ウェブアプリケーションが簡単に書けそうだ」なんていう機能が色々組み込まれています。
テンプレートにレンダリングするバージョン
path '/' => sub { my $req = req; return { template => 'index.html', message => $req->param('message') }; };
JSONで出力するバージョン
path '/' => sub { my $req = req; return { message => $req->param('message') }; };
この2つ、templateという要素を返すか返さないかだけでかなり挙動が違います。上はテンプレートにmessageという変数を渡してレンダリングします。
下はmessageという要素が入ったハッシュをJSONとして出力します。
JSON出力機能がデフォルトでついているという便利さもさることながら、テンプレートを使ったウェブアプリケーションを開発するときにデバッグとしても活躍します。
例えばこんなことはありませんか?
このバグはテンプレートの方が原因なのか、コントローラやモデルが原因なのか。
このように問題を切り分ける際、Nephiaを使っている場合は、さくっと調べることが出来ます。templateの行をこのようにコメントアウトすればいいだけです。
path '/' => sub { my $req = req; return { #template => 'index.html', message => $req->param('message') }; };
これですぐにテンプレートをレンダリングせずに直接テンプレートに投げられている値を調べることができます。テストなどを使ったりモデルに切り出すなどしてやればいいだけなのですが……まあそんな感じで出来ないとか、さっくり思いついたアプリを書いているとかそんな時に使ってほしいですね。
とまあ、こんなかんじでNephiaの思想を一息で(一息です)書いてみました。こんなかんじで文化だとか哲学的な面でプロダクトを見るのは楽しいですね。