ドメイン記述ミニ言語
Domain Modeling Made Functionalで紹介されているドメインのドキュメンテーションのためのミニ言語です。
ワークフローの記述
code:workflow
Bounded Context: 受注
ワークフロー: "注文する"
トリガー: "注文書を受け取った"イベント (チェックボックス「見積」が未チェックの場合)
主要インプット:
注文書
他のインプット:
製品カタログ
出力イベント
"受注した"イベント
副作用:
受注内容に沿って、顧客に受注通知が送信される。
ワークフロー名を動詞で書く。
「トリガー」にこのワークフローを起動するイベントを動詞(過去形)で書く。
「主要インプット」にワークフローが参照するインプットのうちもっとも主要なものを書く。
それ以外のインプットを「他のインプット」に書く。
ワークフローの実行の結果、出力されるイベントを「出力イベント」に動詞(過去形)で書く。
このワークフローの実行の結果、コンテキストの外部へ影響を及ぼすものを「副作用」に書く。
ワークフローに関連するデータ構造の記述
code:data-structures
Bounded Context: 受注
data 注文 =
顧客情報
AND 配送先住所
AND 請求先住所
AND 注文明細のリスト
AND 金額総計
data 注文明細 =
製品コード
AND 注文数量
AND 価格
data 顧客情報 = ??? // 現時点で詳細不明
data 請求先住所 = ??? // 現時点で詳細不明
data 注文数量 = 個数 OR キログラム
data 個数 = 整数 (1 ~ ?)
data キログラム = 数値 (? ~ ?)
dataディレクティブでワークフロー記述中に登場する名詞を定義する。
dataを構成する要素を分解して記述する。
dataの構成要素をさらにdataとして詳細を記述する。(dataが標準型と制約から構成されるところまでブレイクダウンする)
不明なものは後で詳細化できるように「???」としておく。
dataに制約が含まれるものはそれを記述する。
上記例で「注文」という単一のデータ構造だと、価格情報をもっているのでワークフロー"注文する"の主要インプットである注文書は表現できない。(この業務では受注処理時に担当者が製品カタログをみて最新の価格を記載する)
また、注文書を受け取った段階では、顧客情報や住所も未チェックなので、厳密にはワークフロー内でチェック済みのそれとはデータ構造は区別したい。
code: data-structures
data 未検証注文 =
未検証顧客情報
AND 未検証配送先住所
AND 未検証請求先住所
AND 未検証注文明細のリスト
data 未検証注文明細 =
未検証製品コード
AND 未検証注文数量
data 検証済み注文 =
検証済み顧客情報
AND 検証済み配送先住所
AND 検証済み請求先住所
AND 検証済み注文明細のリスト
data 検証済み注文明細のリスト =
検証済み製品コード
AND 検証済み注文数量
data 金額記載済み注文 =
検証済み顧客情報
AND 検証済み配送先住所
AND 検証済み請求先住所
AND 金額記載済み注文明細のリスト
AND 金額総計
data 金額記載済み注文 =
検証済み注文明細のリスト
AND 価格
ワークフロー擬似コード
ワークフロー内部がいくつかの入力→サブステップ→出力の連鎖で構成される場合、サブステップを擬似コードを使って書き出す。
code: workflow-pseudo-code
workflow "注文する" =
input: 注文書
output:
"受注した"イベント
OR 不正な注文
// step1
注文を検証する。
もし注文が検証に失敗したら、注文書を不正な注文の山に加えて、ワークフローを停止する。
// step2
注文に価格を記載する。
// step3
顧客に受注通知を送る。
// step4
"受注した"イベントを返す。
code:substep1-pseudo-code
substep "注文を検証する" =
input: 未検証注文
output: 検証済み注文 OR 検証エラー
dependencies: 製品コード実在チェック, 住所実在チェック
顧客名を検証する。
出荷先住所と請求先住所が実在するかをチェックする。
注文明細各行に対して:
製品コードのシンタックスをチェックする。
製品コードが製品カタログに存在することをチェックする。
すべてがOKであれば:
検証済み注文を返す。
そうでなければ:
検証エラーを返す。