/note/tech

ドメイン記述ミニ言語の設計論

■ 1. 設計の前提

■ 2. 第一層:Lexicon(語彙)

concept 注文
concept 顧客
concept 注文明細

operation 確定する   (注文に対して)
operation キャンセルする (注文に対して)
operation 追加する   (注文明細を注文に対して)

■ 3. 第二層:Syntax(構成規則)

注文 = 顧客 AND List<注文明細> AND 注文状態
注文明細 = 商品 AND 数量 AND 単価
注文状態 = 未確定 | 確定済み | 出荷済み | 完了 | キャンセル済み
数量 = 正の整数   // 型制約も文法の一部

■ 4. 第三層:Semantics(振る舞い)

注文 {
  invariant: 明細は1件以上存在する
  invariant: 合計金額 = sum(明細.単価 × 明細.数量)
}
注文状態の遷移 {
  未確定    --[確定する]--> 確定済み
  未確定    --[キャンセルする]--> キャンセル済み
  確定済み  --[出荷する]--> 出荷済み
  出荷済み  --[受領する]--> 完了
}
operation 確定する {
  pre:  注文状態 == 未確定
  pre:  明細.count >= 1
  post: 注文状態 == 確定済み
  post: 確定日時 が記録される
}

■ 5. 第四層:Pragmatics(文脈)

context 受注管理 {
  concept 顧客 = 名前 AND 配送先住所 AND 注文履歴
}

context 与信管理 {
  concept 顧客 = 名前 AND 与信限度額 AND 支払い履歴
}

mapping 受注管理.顧客 <-> 与信管理.顧客 {
  共通キー: 顧客ID
  受注管理側では与信情報は不可視
}

■ 6. 設計原則

■ 7. 残された課題