5. WAF の役割でないこと モデルの管理 モデルのビジネスロジック モデルの Caching の機構 Etc.. Catalyst で良くない点 Catalyst::Model::* M が Catalyst に依存している Model をプラガブルに拡張するのは、 AF の役割
6. WAF と Model の関係のあるべき姿は? 基本は、 Model は Web の世界からは切り離されていること MVC の M は POPO(Plain Old Perl Object) で構成する Why ?
7. M を WAF から切り離すべき理由 Testability が向上する モデルの Unit Test が Catalyst を使わずに可能に テストの実行速度が早くなる Web のコンテキスト以外での再利用 が可能になる POPO Service POPO Model (Schema::* など) CLI (App::CLI, App::Cmd) WebAPI (Catalyst::Controller::Resources) Catalyst::Controller M
18. Service Layer + Domain Model 「モデル」を Service と Domain Model に分ける Service Layer Application logic(Workflow logic) Domain Model に対して問題を解決するよう処理を委譲 Publish するインターフェースの明示 Controller に見せる処理の明示 トランザクション境界 Domain Model Domain logic 問題領域のロジックは Domain Model に ここに主にロジックを記述
20. 仮定に基づいた Domain model と Service Layer への疑問 DB の構造を見せないリッチな OO なドメインモデルが必要? 多くの場合不要。無駄に Domain Model をラップすることになる DB だけの場合、 Domain Model=ER モデル で十分 ドメインモデルでは、 DB に依存しない抽象化が必要 ? DB しか使わなければ、抽象化不要 常に Controller は Service Layer を介する必要あり? そんなことはない。直接 Domain Model を触ってもよい。 1 つのドメインモデルのロジックしか必要ないこともある
21. Service Layer + Domain Model の現実解 Service アプリケーションロジック ( ワークフローロジック)を書く 複数のモデルにまたがるロジック 複数のモデルへ処理をディスパッチする 薄い ロジック サービスは基本的に 1 ユースケースに対応させる Domain Model ドメインロジックを記述する DB のみの場合 一つのテーブル (Schema::X) に依存したビジネスロジック Domain Model= ER モデル とする Controller は、 Service or Model にアクセス Controller にはロジックは記述しない ユースケースが CRUD のみのオペレーションに対応する場合、 Domain Model のロジックに直接アクセスしてもよい
22. Catalyst にマッピングすると POPO Service POPO Models (With DBIC) Catalyst Controller Catalyst View POPO Models (With DBIC) M これが一番シンプルなマッピング モデルに対する要求は他にもあり、他のマッピング方法もある
24. DI コンテナ + POPO Model のアーキテクチャ POPO Service POPO Model (Schema::* など参照 ) Catalyst Controller Catalyst View DIコンテナ Catalyst Plugin DI コンテナで POPO を Wiring Plugin or Controller で DI コンテナを参照し、 WAF と M を繋ぐ
25. DI コンテナを利用したモデル構築 DI コンテナ利用の利点 モデルは DI コンテナで Wiring されるため、モデルが Catalyst の context に依存することが無くなる モデル間の実装の依存関係が切れる モデル (Service, Model) の参照方法の一例 Controller から直に DI コンテナを参照する $self->model(“Service::Blog”)->create(); プラグイン化して Context から DI コンテナを参照する $c->pmodel(“Service::Blog”)->hello(); Catalyst::Model::Adaptor じゃできない? Catalyst::Model::Adaptor では、 POPO Model と Adaptor が 1:1 対応してしまう
26. まとめ Catalyst は WAF としては必要十分 モデル (Service, Domain Model) について モデルは WAF から切り離すべき ビジネスロジックはモデルに押し込む MVC を考えるときは、モデルの Testability を中心に考える モデルのアーキテクチャについて Web アプリケーションの多くは、 ServiceLayer + Domain Model の変形でよいのでは Catalyst に不足しているもの WAF と POPO Model を繋ぐ仕組み DI コンテナはそれに対する一つの答え MVC の M の拡張などは WAF ではなく、 AF で