ドメイン駆動開発道

ドメイン駆動開発を実践できず、悶々とする毎日を送るおやじSEのブログです。

ドメインモデルに振る舞いを定義する方法

クラスの振る舞いを定義するために、クラスの責務やコラボレーションを識別する必要があります。
そのための方法はいろいろとありますが、本サンプルでは、以下の流れでクラスの責務やコラボレーションを識別します。

  1. リクエストの識別・・・ユースケースや画面から、アプリケーションが処理するリクエストを識別する。
  2. メソッドの識別・・・プレゼンテーション層やビジネス層のFacadeが各リクエストを処理できるようにドメインモデルにインターフェースを定義する。
  3. テスト駆動開発による実装・・・各リクエストに対して、テスト駆動を使ってインターフェースを実装していく。

次回は、リクエストの識別として、システムイベントメッセージを抽出します。

ドメインクラスの役割

ドメインクラス図のクラスを、役割によってカテゴライズします。
本サンプルでは、書籍「ドメイン駆動設計」より以下の役割けを利用します。

  • エンティティ(Entities)

 エンティティは、識別子を必要とするオブジェクト。本サンプルでは、PendingOrder、Order、Restaurantが該当する。

  • バリューオブジェクト(Value Objects)

 属性の値によって定義されるオブジェクト。基本的には不変のオブジェクトで、同じ値のオブジェクトは交換可能。本サンプルでは、PaymentInformation、Addressが該当する。

  • ファクトリ(Factories)

オブジェクトを生成するためのオブジェクト。

  • レポシトリ(Repositories)

 レポジトリは、エンティティの集合を管理する。従って、オブジェクトを取得したり削除したりするメソッドが定義される。レポジトリは、永続化フレームワークカプセル化するためのインターフェースと具象クラスから構成される。 OrderRepository、PendingOrderRepository、RestaurantRepositoryが必要になってくると想定される。

  • サービス(Service)

 アプリケーションのワークフローを実装するため、ユースケースを遂行するメソッドを定義する。なので、本サンプルでは、ユースケース「Place Order」のステップを実現するためのメソッドを定義する。PlaceOrderServiceクラスを追加する。


エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

ドメインモデルパターンのアーキテクチャ

ドメインモデルパターンを使ったアプリケーションを作成するので、
お馴染みのプレゼンテーション層、ビジネス層、永続化層の3階層で構成します。
ドメインモデルがビジネス層のコアとなり、プレゼン層やファサード層によって呼び出されます。
永続化が必要なオブジェクトは、永続化フレームワークによってデータベースとマッピングされます。


f:id:katzn:20130421100004g:plain

ユースケース「Place Order Use case」

今回使うサンプル・アプリケーションは、
料理の配達専門会社(Food To Go Inc.)がお客から料理の配達を受付するシステムです。
ユースケースはいろいろと想定されますが、1つ抜粋して、お客が注文する部分のユースケース「Place Order Use case」を扱います。

ユースケース:「Place Order Use case」 

  1. ユーザは、配達先住所と配達時間を入力する。
  2. システムは、配達時間が、未来の日時であり、その時間に少なくとも一つのレストランが営業していることをチェックする。
  3. システムは、配達先住所と配達時間を注文情報に設定する。
  4. システムは、利用可能なレストラン一覧を表示する。
  5. ユーザは、レストランを選択する。
  6. システムは、レストランを注文情報に設定する。 
  7. システムは、選択されたレストランのメニューを表示する。
  8. ユーザは、料理とその数を入力する。
  9. システムは、料理とその数を注文情報に設定する。
  10. システムは、注文情報と支払い情報(クレジットカード情報)の入力画面を表示する。
  11. ユーザは、支払い方法・情報を入力する。
  12. システムは、支払い方法・情報を注文情報に設定する。
  13. システムは、注文情報と合計金額、消費税などの費用を表示する。
  14. ユーザは、注文内容を確認する。
  15. システムは、クレジットカード情報の認証や与信処理を行い、確定された注文情報を作成する。
  16. システムは、注文確認の内容として、オーダーNoを含む注文情報を表示する。


次回は、実現方法の概略について検討します。

最初の題材

今後いろいろな題材を元に、ドメイン駆動開発(DDD)を勉強&実践していきます。

まずは、書籍「POJOs IN ACTION」からのサンプルアプリを利用します。

この本は、日本語に翻訳されていないので、マイナーかもしれませんが、
DDDをベースにして設計~実装まで解説している貴重な一冊です。
もちろん、サンプルコードもダウンロードできます。
ただ、UI(画面)の実装は対象外となっているので、自分で実装する必要があります。

この本のサンプルアプリから、
あるユースケースを元に画面も含めて実装まで行っていきたいと思います。
ドメイン部分のサンプルコードはあるので、最初に手をつけるのは良い題材かなと。
次回、ユースケースを掲載します。

ちなみに、使用する技術は、Java、Spring、Hibernateなどです。


Pojos in Action: Developing Enterprise Applications With Lightweight Frameworks

Pojos in Action: Developing Enterprise Applications With Lightweight Frameworks