ドメイン・モデルの基本構成要素

SimpleModelingではドメイン・モデルを構成する基本構成要素として以下のものを使用します。

  • エンティティ

  • バリュー

  • データ型

  • パワータイプ

  • サービス

  • イベント

  • ルール

  • コンポーネント

  • サブシステム

SimpleModelingでは、現実世界の構造をこれらのモデル要素を使って写し取ります。

ドメイン・モデルの構成要素
Figure 1. ドメイン・モデルの構成要素

ドメイン・モデルのモデルであることを明示したい場合には、ドメイン・エンティティなどのように先頭に「ドメイン」をつけますが、ドメイン・モデルについて議論している場合には単に「エンティティ」というように先頭に「ドメイン」をつけないで呼ぶことにします。

分類子

UMLではモデル要素の中のクラス的なモデル要素を分類子(classifier)と呼びます。

分類子の一種として以下のモデル要素が存在します。

  • クラス

  • データ型

  • パワータイプ

  • コンポーネント

クラスは後ほど取り上げるとして、それ以外の分類子直下にあるモデル要素について説明します。

なお分類子はドメインの構成要素の分類上、本記事に登場していますが、ドメイン・モデリングの中ではほぼ登場することはありません。

ドメイン・データ型

ドメイン・データ型はドメイン・モデル内で定義しているデータ型です。

データ型は「プロファイル:基本データ型」で用意している基本データ型をベースに、制約や意味を付与したドメイン固有のデータ型を定義します。

例: EmailAddress, PostalCode

ドメイン・パワータイプ

ドメイン・パワータイプはドメイン・モデル内で定義しているパワータイプです。

パワータイプはあるクラスの分類を表現するモデル要素です。

伝統的な区分コードと近しい目的で使用します。

プログラムでの実装時にはenum型を使用することが多いでしょう。

例: 顧客種別(CustomerType)、商品カテゴリ(ProductCategory)

ドメイン・コンポーネント

ドメイン・コンポーネントはドメイン・モデルの機能的な単位を表します。

複数のエンティティやサービスを内包し、再利用可能な構造単位です。

ドメイン・サブシステム

サブシステムはコンポーネントの一種であり、アプリケーション全体で明確な責務を持つドメイン領域をカプセル化したものです。

例:課金サブシステム、在庫管理サブシステム ドメイン・クラス

UMLの定義では分類子の一種にクラスがあり、一般的なクラスの性質を提供しています。

SimpleModelingではドメイン・モデルの構成要素となる主なクラスとして以下のものを用意しています。

  • ドメイン・エンティティ

  • ドメイン・バリュー

  • ドメイン・ルール

  • ドメイン・サービス

ドメイン・エンティティ

ドメイン・エンティティはドメイン・モデルを構成するエンティティ・オブジェクトです。

データベースなどに記録され、ソフトウェアの開始終了のライフサイクルを超えて永続的に存在し続けるオブジェクトです。

SimpleModelingではドメイン・エンティティは以下の4種類に分類されます。

  • ドメイン・リソース

  • ドメイン・タスク

  • ドメイン・アクター

  • ドメイン・ロール

ドメイン・リソース

ドメイン・リソースはソフトウェアの動作に必要な「資源」に関する情報を表すエンティティ・オブジェクトです。

性質

静的(マスターデータ)

生成タイミング

システム運用前または安定時に登録

主な目的

情報の定義・参照

永続性

長期間参照され、頻繁には変更されない

状態遷移

通常運用中での状態遷移はもたない

関係性

他のエンティティに参照される(参照される側)

削除・変更

滅多に削除されず、変更も限定的(履歴保持が前提)

アプリケーションUI

参照や選択のUIが必要

代表例

顧客、商品、倉庫、部署など

ドメイン・タスク

ドメイン・タスクはソフトウェアの動作中の「動作」に関する情報を表すエンティティ・オブジェクトです。

性質

動的(トランザクションデータ)

生成タイミング

業務処理中に逐次生成される

主な目的

業務の実行・記録

永続性

永続化されるが、完了後は基本的に不変

状態遷移

明確な状態遷移を持つ(例:草稿→確定→完了)

関係性

他のエンティティを参照する(リソースを使う)

削除・変更

完了後は基本的に変更しない(監査目的)

アプリケーションUI

作成・編集・処理・状態遷移のUIが必要

代表例

受注、支払、休暇申請、問合せ、承認依頼など

ドメイン・アクター

ドメイン・アクターはユーザや外部システムなどシステム外のオブジェクトを表現する代理オブジェクトです。

例:利用者(User)、決済サービス(Payment Service)

ドメイン・ロール

ドメイン・ロールはエンティティが果たす役割や関係性を表す抽象的なエンティティ・オブジェクトです。

例:担当者(Assignee)、発行者(Issuer)

ドメイン・バリュー

ドメイン・バリューは識別子を持たず、値としてのみ意味を持つ不変オブジェクトです。

例:金額(Money)、住所(Address)

ドメイン・イベント

ドメイン・イベントは、ドメイン内で発生するイベントをモデル化したものです。

業務上の状態変化を記録し、通知やイベントソーシングなどにも活用します。

例:注文確定(OrderConfirmed)、在庫変動(InventoryChanged)

ドメイン・ルール

ドメイン・ルールは、ドメイン内で使用されるルールを集めたオブジェクトです。

業務ロジックや制約条件など、ドメインにおける規則や判断基準を表現します。

ドメイン・サービス

オブジェクトに帰属しない手続的な業務ロジックを表現します。

サブシステム/コンポーネント外部に公開する処理や、複数のドメイン・オブジェクトを横断的に扱う処理に適用されます。

例:請求書の発行、決済処理、在庫の一括調整

ドメイン・オブジェクト

ドメイン・オブジェクトという用語は狭義にはドメイン・クラスのインスタンスを指しますが、SimpleModelingでは広義の意味として、ドメイン・モデルを構成する分類子全般を定義とインスタンスを含めてドメイン・オブジェクトと呼ぶことにします。

具体的には本記事で説明した以下の分類子が該当します。

  • ドメイン・エンティティ

  • ドメイン・バリュー

  • ドメイン・イベント

  • ドメイン・サービス

  • ドメイン・ルール

  • ドメイン・データ型

  • ドメイン・パワータイプ

  • ドメイン・アクター

  • ドメイン・ロール

  • ドメイン・コンポーネント

  • ドメイン・サブシステム

状態機械

状態機械は、ドメイン・オブジェクトのライフサイクルにおける状態変化や制御ルールを定義する仕組みです。

特にドメイン・タスクなどのエンティティは、明確な状態遷移を持ち、業務の進行状況を状態として管理します。

状態機械は分類子ではありませんが、ドメイン・モデルの振る舞いを明示的に表現するための重要な要素です。