前回の
Mojoliciousから見る内部DSLの利点と欠点
まず、
Mojoliciousは人気のあるPerlのWebアプリケーションフレームワークです
- routesオブジェクトにルーティングを定義していくオブジェクト指向的なやり方
- RubyのSinatraに端を発した簡潔な内部DSLで定義するやり方
の2種類をサポートしています。それぞれの方法で定義したものが以下です。
{
package MyApp;
use Mojo::Base 'Mojolicious';
sub startup {
my $self = shift;
my $routes = $self->routes;
$routes->get('/')->to('example#index');
$routes->post('/count')->to('example#count');
}
}
{
package MyApp::Controller::Example;
use Mojo::Base 'Mojolicious::Controller';
sub index {
my $self = shift;
$self->render(text => "Hello, World!");
}
sub count {
my $self = shift;
my $count = $self->session('count') || 0;
$self->session(count => ++$count);
$self->render(text => "Posted $count");
}
}
require Mojolicious::Commands;
Mojolicious::Commands->start_app('MyApp');
use Mojolicious::Lite;
get '/' => sub {
my $self = shift;
$self->render(text => "Hello, World!");
};
post '/count' => sub {
my $self = shift;
my $count = $self->session('count');
$self->session(count => ++$count);
$self->render(text => "Posted $count");
};
app->start;
まずオブジェクト指向版を見てみます。ルーティングを定義しているのはルートオブジェクト$routes
のget
、post
メソッドを実行しているところです。これで、
- /にGETリクエストが来たらMyApp::Controller::Exampleのindexメソッドを実行する
- /countにPOSTリクエストが来たらMyApp::Controller::Exampleのcountメソッドを実行する
というルーティングが定義されます。
次にDSL版のほうを見ています。おそらくこちらのほうは、get
、post
サブルーチンによって、
- /にGETリクエストが来たら後続のサブルーチンリファレンスを実行する
- /countにPOSTリクエストが来たら後続のサブルーチンリファレンスを実行する
と定義しています。
DSL版の利点
さて、
DSL版の欠点
一方でDSL版の欠点はあるでしょうか。
第一に、get"/" => sub { my $self = shift; ... };
の$self
に何が渡されているのかわかりませんでした。またルーティングとは少し離れますが、
すなわち、
第二に、
以上、
<続きの