Tips_Of_Domain-Driven_Design

ドメイン駆動設計のTips

要件収集

関数型ドメインモデリング ドメイン駆動設計とF#でソフトウェアの複雑さに立ち向かおう

要件収集の際にはすべてを受け入れる姿勢を保ち、自分の技術的な考えをドメインに押しつけないことです。

  • 要件収集時に頭の中でクラス設計をしてはいけない

ドメインの文書化

  • ドメインエキスパートにも理解できる内容を記述する
  • 非プログラマを尻込みさせず、一緒に作業することを目指す

ドメインの記述

  • UMLは作業がしにくいため、以下のようなシンプルなテキストベースの言語で記述する
ドメイン境界: 注文

- ワークフロー: 注文確定
    - トリガー
        - 「注文フォーム受領」イベント
    - 最初の入力
        - 注文フォーム
    - 他の入力
        - 製品カタログ
    - 出力イベント
        - 「注文確定」イベント
    - 副作用
        - 注文確定に伴う領収書が顧客に送信される

データ構造の記述

  • ドメインのデータ構造を最小限の方法で記述する
ドメイン境界: 注文

data 注文 = 
    顧客情報
    送付先住所
    請求先住所
    注文明細リスト
    請求金額

data 注文明細リスト =
    商品
    注文数量
    金額

data 顧客情報 = ??? // 未確定
data 請求先住所 = ??? // 未確定
  • 制約も表現する
data 食品系商品コード = "F" から始まる4桁の数字
data サプリ系商品コード = "P" から始まる3桁の数字
data 商品コード = 食品系商品コード or サプリ系商品コード

data 注文数量 = 個数 or 重量
data 個数 = 1以上の数値
data 重量 = 小数

ライフサイクルの記述

data 未検証-注文 = 
    未検証-顧客情報
    未検証-送付先住所
    未検証-請求先住所
    未検証-注文商品明細

data 価格計算済み-注文 =
    検証済-顧客情報
    検証済-送付先住所
    検証済-請求先住所
    検証済-注文商品 リスト
    請求金額 // 追加

data  検証済-注文商品
    検証済-注文明細
    小計 // 追加

data 確定済注文領収 =
    確定済-注文
    領収書

ワークフローの具体化

workflow 注文確定 = 
    input: 注文フォーム
    output:
        「注文確定」イベント
        or 注文失敗
    
    // ステップ1
    do 注文検証
    If 注文が無効 then:
        注文失敗を履歴に追加
        stop

    // ステップ2
    do 注文金額算出

    // ステップ3
    do 注文確定を顧客に通知

    // ステップ4
    return 「注文確定」イベント