― Web Technology and Life ―

【Amon2のオレオレTips】MVCを意識したModelの実装要件

2013-01-02
PerlのウェブアプリケーションフレームワークのAmon2を使うときModelってどうするの?って疑問が沸きませんか?Largeフレーバー以外でセットアップすると、シナトラリッシュなDispatcher(Router)でセットアップされるので、基本的にコントローラーに全部実装してしまおうかなーって気になるんですけど、そうじゃないMVCを意識したケースはどうしようかなーという時のオレオレ理想の要件です。

MVC的なWAFの実装について

ウェブアプリケーションフレームワークを使うと、M(モデル)とV(ビュー)とC(コントローラー)の3つにわけてクラス設計を行うのが基本と言われていますが、細かい実装をどこに持って行こうか悩むケースにしばしば出くわしますね。とくに、薄いフレームワークと言われるWAFほど、Modelについてはノータッチで自由な設計が逆にできすぎて悩んでしまうことがしばしばではないでしょうか?そんなことないでしょうか?はい、ない人は新年早々細かい話は避けてゆっくりお酒を飲んで下さい。

Amon2のModelを実装しようとするときのオレオレ要件

類にもれず、Amon2のほとんどのFlavorでは、コントローラーにそのままロジックを書いちゃってもいいような軽量アプリの実装の道筋が示されていることが多いので、古典的なMVCの実装をしたいとき、具体的には、コマンドラインからも何らかの操作を行いたいようなアプリを実装してModel単独で動くようなコードを実装しようとすると、なかなかどうしようか悩むんじゃないかと思うんですが、私だけですかね?w

とりあえず、で、個人的な要件としては、

  • Model単独でテストができる
  • モデルクラスをいちいちコントローラーでuse,newしたくない

という感じなのですが、それぞれ掘り下げていきたいと思います。

Model単独でテストができる

いわゆるコントローラーとモデルを疎結合にするというやつですね。このあたりは、以前のYokohama.pmでYappoさんが発表していた内容とか、最近tokuhiromさんとytnobodyさんがブログに書いていた内容なんですが、まとめると、

  • モデルでは、$cはコントローラーから引廻わさない
  • モデルでは、MyApp->bootstrapで$cを呼ばない
  • モデルでは、sub c {MyApp->context}か,Amon2::Declareでc()を呼ぶ

モデルの中でも、config呼びたかったり、DB使うには、configの設定引っ張ってこないといけなかったりするので、cを何らかのかたち使いたいんですが、ちょっとコツがいる感じですね。

なお、若干疑問なんですが、Amon2::Declareをuseして、c()で呼び出すってあっているんでしょうか?調査不足で、Amon2::Declareの使い方についていまいちよくわかっていないというか、不安なんですが(苦笑)

モデルクラスをいちいちコントローラーでuse,newしたくない

具体的には以下のように書きたくなくて、

package MyApp::Web::C::Root;
use strict;
use warnings;
use utf8;
use MyApp::Model::Hoge;

sub index {
    my ($c,$args) = @_;

    my $obj = MyApp::Model::Hoge->new();

    my $data = $obj->fetch($args->{foo});
    .
    .
    .
}

以下のようにしたいということですね。

package MyApp::Web::C::Root;
use strict;
use warnings;
use utf8;

sub index {
    my ($c,$args) = @_;

    my $data = $c->model('Hoge')->fetch($args->{foo});
    .
    .
    .
}

つまり、「MyAppクラスになんらかの方法で、modelクラスを一括でイニシャライズして、メソッドとしてつっこんでおく」という実装が必要ということですね。

まとめ ~Model実装におけるオレオレポイント~

ということで、まとめると以下のように実装したいということです。

  • モデルでは、$cはコントローラーから引廻わさない
  • モデルでは、MyApp->bootstrapで$cを呼ばない
  • モデルでは、sub c {MyApp->context}か,Amon2::Declareでc()を呼ぶ
  • モデルは、Amon2クラスを継承したクラスのメソッドとしても呼び出せる

ということで、次回はこのポイントを満たすようなモデルをどのように実装したかについて書きます。ちなみに、Modelの中心となるデータベースはO/RマッパーのTengを使うことを前提としていきます。

ということで、やっとこ書いた次回が、「MVCを意識したModelの具体的な実装とその考察」です。

ツッコミどころがあればどしどしお待ちしています。

Perl update_at : 2013-01-06T13:27:54
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus