Symfony Advent Calendar 2014 (Qiita) 6日目


「Domain Kata」について学んだことを書いて、Symfony2 サンプルアプリケーションでの使用例を紹介します。

Domain Kata について

Domain Kata

Kata for domain models

公式 README の内容を日本語に訳すと下記となります(バージョン 1.2 現在)。

Domain Kata は、プロジェクトがモデルベース開発を実践するために、ドメインモデルの「」を提供します。 モデルベース開発というのは、たとえば、ドメイン駆動設計、ジェネレ−ティブプログラミングといった手法を指します。 Domain Kata を使うことで、モデルの識別が容易になります。パッケージ構造を設計しやすくなります(「Model」パッケージをライブラリで使うのはやめましょう)。 型による制約を与えることにより、ドメイン指向フレームワークの基盤とすることができるでしょう。

Domain Kata は、PHPメンターズの @itemanさん、@hidenorigotoさんによるOSSプロダクトの1つです。

フィーチャ

  • エンティティとその操作の Interface
  • リポジトリとその操作の Interface
  • 仕様の Interface
  • ユースケースの Interface

メタモデル

モデルを記述するためのモデルのことを「メタモデル」と言います。 ここでは、ドメインモデルに対して、一般化されたモデルが持ち込まれることになります。メタモデル間の関連が、制約として設計されます。

Symfony2サンプルアプリケーションでの使用例

実際に使ってみるとどんな感じになるのか知りたいと思いました。既存で公開されていた Symfony2サンプルアプリケーションに対して、Domain Kata を使うように変更して、Pull Request を出しました。これをもとにバージョンアップされた最新版がこちらです。
Symfony2ベースのユーザー登録サンプル(Github)

「ユーザー登録サンプル」の説明

ユースケース [ユーザを登録する]
ユーザ情報を受け取って、 [ユーザエンティティ] を作成する。 [ユーザリポジトリ] に [ユーザエンティティ] を登録する。 ユーザにアクティベーションメールを送信する。
ユースケース [ユーザをアクティベーションする]
アクティベーションキーを受け取って、ユーザをアクティベーションする。

バンドル作成

UserRegistrationBundle を作成します。

Domain Kata のインストール


composer require phpmentors/domain-kata "~1.3@dev"

Domain Kata を組み込む

主要な部分をクラス図で表すと、下図のようになります。

user_registration_domain_kata

  • ユーザ登録ユースケース(UserRegistrationUsecase)は更新を伴うので、CQRS(コマンドクエリ責務分離)でいうとコマンドの方になります。

感想

  • どんなフレームワークを今使っているかとは関係なく、設計のテンプレートとして型を使うことができるようになります。 複数のプロジェクト、ライブラリを、組み合わせて作っていく、という現代の開発スタイルにおいて、これは共通的に利用できます。
  • このシステムのエンティティは何か?といったごく基本的な設計が型で決まることにより、一貫性のある実装になると思います。ありふれたモデルについて個々の担当者が設計に悩むということは無くなるため、アプリケーション独自の固有な設計の方に対して集中しやすくなりそうです。
  • PHP言語仕様のため、Interface のメソッド名が他の既存のメソッド名と衝突する場合は、個別に工夫が必要になります。

ドメインにおけるサービスについて

一般に、ドメインにおけるサービスは、下記2つに分類することができるのではないでしょうか。

  1. ドメインユースケース
  2. その他サービス

ユースケースは、システムとそのアクター(人またはシステム)のインタラクションを表します。 今回は、ドメインモデルにおける構成要素として、[ユーザ登録ユースケース]を切り出しています。Webのコントローラ(アプリケーション)からドメインユースケースを呼び出す形です。ユースケースが再利用可能な単位となります。

後者の「その他サービス」の例として、DDDにおける仕様パターンが挙げられます。

・・・・・・・・・・・・・・・・・・・・

余談:私は業務で Symfony を使ったことは無いのですけれども、今回Symfonyユーザ会の皆さんに混じって記事を書いて、良かったです。いろいろと得るものがありました。皆さんの記事とかジョークとかも楽しく読んでおります。アドベントカレンダー企画ありがとうございました!

参考記事