Bulknews::Subtech RSSフィード

2008/03/06 (木)

Catalyst と MVC 09:02  Catalyst と MVC - Bulknews::Subtech を含むブックマーク はてなブックマーク -  Catalyst と MVC - Bulknews::Subtech

no title

ちょっと盛り上がってるので事例を紹介。

Six Apart では Vox などで Catalyst つかってますが、アプリケーションの下の Model (実際にいうと Vox::App::M 以下) は空っぽです。意味ないから。

Catalyst の Model にもともと自分が期待していたのは Rails でいう ActiveResource (だっけ?名前わすれた)みたいなもので、LDAP にエントリをつくるのも データベースにレコードを追加するのも、

$c->model("DBIC::Foo")->create(context => $c, request => $c->request);
$c->model("LDAP::Foo")->create(context => $c, request => $c->request);

みたいに抽象化されたAPIで出来る、ってのを期待していたんだけど、ちまたにあふれる Catalyst の Model ってそんな賢いものではなくて、

$obj = SomeClass->new(%opt);

のかわりに

$obj = $c->model('SomeClass')

とかけて %opt は設定ファイルに書く、っていう、ただそれだけなんですね。これじゃ全然つかいものにならないし、Model::Adaptor のラッパーで使いたければそれでもいいかもしれないけど、単にオブジェクト生成するところやメソッド通すときにラッパー一段増えるだけで別になにもうれしくない。

で、maki さんが書いてることなんだけどこれはうちもやってます。ただ Model にするんじゃなくて C というクラス (Vox::C::Blog とか) に書いてる。Catalyst の MVC (Vox::App::C) とは違う階層においてあるのでちょっと紛らわしいけど、複数の M (ほとんどが Data::ObjectDriver ベースの Model エンティティクラス) を操作するプロシージャコールみたいなメソッドをまとめて定義したクラスを書いて、それを Web やらバッチ、TheSchwartz のイベントワーカーとかから呼び出す(逆に言うと web の Controller は URL パラメータをそのクラスにマッピングするだけ)、って感じ。

Model に直接メソッドを書いて Controller から呼び出すのも別に悪くはないとおもうけどイベント処理とかいろんなところからメソッド呼んだりするので共通化できるメリットがあるし、 Web コンテキスト関係なくテストできるのでユニットテストも書きやすくなる。これを Model と呼ぶかは微妙ですが、dmaki さんのエントリではこういう抽象化したデータエントリクラスを Model と呼んでいるのであって、おそらくやっていることは同じかと。

これを M と呼ぶか C と呼ぶかは議論がわかれそうですが、Model をコントロールするクラス群であって実際にオブジェクトが生成されることはないので C という風に命名しています。