型の合成によるドメインモデルの構築
合成可能な型システムは、DDD をするうえでおおきな助けとなる 型を組み合わせるだけで、複雑なモデルをすばやく作成できるため
e.g. Eコマースサイトの支払いの追跡
小切手番号(CheckNumber)のようなプリミティブ型のラッパーから定義する
code:fsharp
type CheckNumber = CheckNumber of int
type CardNumber = CardNumber of string
低レベルの型(単純な AND / OR 型)を構築する
カードの種類(CardType)
code:fsharp
type CardType = Visa | Mastercard
カードの情報(CreditCardInfo)
code:fsharp
type CreditCardInfo = {
CardType : CardType
CardNumber : CardNumber
}
支払い手順(PaymentMethod)
code:fsharp
type PaymentMethod =
| Cash // 現金
| Check of CheckNumber // 小切手
| Card of CreditCardInfo // カード
基本的な型を構築
支払い総額(PaymentAmount)
code:fsharp
type PaymentAmount = PaymentAmount of float
通貨(Currency)
code:fsharp
type Currency = EUR | USD
トップレベルの型
支払い(Payment)
code:fsharp
type Payment = {
Amount : PaymentAmount
Currency : Currency
Method : PaymentMethod
}
これらは単なる型なので、関連する動作は無い
代わりに関数を表す型を定義する
e.g. Payment を使って未払いの請求書を処理し、最終的には支払い済みの請求書を返す
code:fsharp
type PayInvoice =
UnpaidInvoice -> Payment -> PaidInvoice
e.g. 支払いをある通貨から別の通貨に変換する
code:fsharp
type ConvertPaymentCurrency =
Payment -> Currency -> Payment