More Related Content
Similar to ドメイン駆動設計 本格入門 (20)
ドメイン駆動設計 本格入門
- 28. 計算モデル
計算モデル
• 計算式
• 判定式
• 判定結果による条件分岐
データモデル
• 計算(プログラム)の関心事から独立したデータの記録と参照のモデル
• ビジネスアプリケーションを実現するために必須
• しかし、ソフトウェアの複雑さに立ち向かう主軸ではない
2019/3/22 ©有限会社 システム設計 28
- 31. ビジネスルールのモデリング
• データモデル → 外周の関心事
• 計算に必要な元データの記録と参照
• 計算結果の記録
• 計算モデル → 中核の関心事
• ビジネスルールの計算ロジック判定ロジックそのもの
• メモリ上で完結する
• 計算と入出力の分離
• 計算の準備としての入力
• 計算の後処理として出力
2019/3/22 ©有限会社 システム設計 31
- 41. 値オブジェクトとは?
• Fact の表現手段
• 数値、時間、場所、識別番号、識別名称、…
• ビジネスとして適切な値の範囲を定義する
• Rule (計算ロジックや判定ロジック)の置き場所
• Factを使う計算や判定をメソッドとして記述する
• Factと持つオブジェクトに、関連するロジックを集める
• Goal 知りたいこと(計算結果、判定結果)の表現手段
• 知りたいことを表現した型(値の種類)を設計する
• メソッドの返す型として使う
2019/3/22 ©有限会社 システム設計 41
- 42. 値オブジェクトのカタログ
単一の値 範囲型(from-to) 範囲型のコレクション
数
値
金額型
Amount, Money
金額範囲
x円以上 y円未満
金額範囲のコレクション
価格帯
数量型
Quantity, NumberOfXxx
数量範囲
m人以上 n人以下
数量範囲のコレクション
数量別割引率
時
間
日付型
DueDate, XxxDate
期間
開始日 - 終了日
期間のコレクション
シーズン
時刻型
HourTime, XxxTime
時間
開始時刻 – 終了時刻
時間のコレクション
時間帯
空
間
地点型
Point
接続
Path:出発点 – 到達点
接続のコレクション
Route [Path,…]
-
地域型
Area, Zone
地域のコレクション
階層、隣接関係、…
2019/3/22 ©有限会社 システム設計 42
- 45. 計算の種類 説明、メソッド例 結果の型
等値判定 isEqual( other ) , notEqual( other ) boolean / enum
大小判定 greaterThan( other ), lessThan( other ), … boolean / enum
加算・減算 同じ型同士の計算 同じ型
乗算 同じ型同士の乗算は意味がないことが多い 別の数値型
除算 同じ型の除算と、異なる型の除算では、意味が異なる 別の数値型
境界 Max, Min の存在 同じ型(の固定値)
列挙 prev(), next() が可能な集合 (循環が可/不可) 同じ型
文字列表現 値の標準的な文字列表現 toString() 文字列
文字列からの生成 標準的な文字列表現からのオブジェクト生成 parse() 同じ型
計算の候補(単一値)
2019/3/22 ©有限会社 システム設計 45
- 46. 計算の種類 説明、メソッド例 結果の型
等値判定 isEqual( other ) , notEqual( other ) boolean / enum
大小判定 greaterThan( other ), lessThan( other ), … boolean / enum
範囲に含まれる contains( element ), encloses( other ) boolean / enum
範囲が重複する isOverlapped(other) boolean / enum
厳密に隣接する isConnectedTo(other) boolean / enum
境界の値 Max, Min , 要素の型
範囲演算 intersect(other), minus(other), add(other) 範囲型
文字列表現 標準的な文字列表現 toString(), show(), describe() 文字列
計算の候補(範囲型 from-to)
2019/3/22 ©有限会社 システム設計 46
- 56. 計算の種類 説明、メソッド例 結果の型
サイズ count() int
要素の検査 contains(要素), isEmpty(), notEmpty() boolean / enum
部分集合 select(条件), reject(条件), コレクション
集約演算 sum(), min(), max(), average(), … 集約結果の型
集合演算 insersect(other), minus(other), add(other) コレクション
変換 unique(), sort(), groupBy() コレクション
要素の取り出し first(), last(), at(index) 要素の型
要素の追加 add(), addAll(), append(), insertAt(), … void
文字列表現 show(), describe() 文字列, 文字列[ ]
計算の候補(コレクション)
2019/3/22 ©有限会社 システム設計 56
- 61. 登場するパターン
2019/3/22 ©有限会社 システム設計 61
基本要素
エンティティ
値オブジェクト
ドメインサービス
モジュール
オブジェクトの
ライフサイクル
集約(アグリゲート)
リポジトリ
ファクトリ
ユビキタス言語 モデル駆動設計
実践的モデラー
しなやかな設計
意図の明白なインタフェース
副作用のない関数
表明
概念の輪郭
独立したクラス
閉じた操作
レイヤードアーキテクチャ
スマートUI
コンテキスト境界
継続的な統合
コンテキストマップ
共有カーネル
顧客・供給者
順応者
腐敗防止層
別々の道
公開ホストサービス
公表された言語
コアドメイン
汎用的なサブドメイン
凝集されたメカニズム
ドメインビジョン声明文
コアのハイライト
コアの隔離
コアの抽象化
進化する秩序
システムのメタファ
責務のレイヤ
知識レベル・運用レベル
- 70. 2019/3/22 ©有限会社 システム設計 70
ドメインロジック → ビジネスルール
ドメインモデル → 計算モデル
オブジェクト指向 → 型指向のプログラミング
このように意味を限定して読んでみると、ずいぶんわかりやすくなる
- 72. 全体の構成
2019/3/22 ©有限会社 システム設計 72
第1部
ドメインモデルを
機能させる
第2部
モデル駆動設計の
構成要素
第3部
深い洞察に向かう
リファクタリング
第4部
戦略的設計
1章~3章 4章~7章 8章~13章 14章~17章
概論と基本事項
ここだけでは役に立たない
役に立つモデルを
手に入れるための
実用的な設計技法
大規模に適用する
長期的に取り組む
ための技法
- 74. 第3部:役に立つモデルの実用的な設計技法
2019/3/22 ©有限会社 システム設計 74
9章
暗黙的な概念を明示的にする
10章
しなやかな設計
ビジネスルールが
コードで明示できてないことの検知
「制約」や「ルール」を
クラスやメソッドで表現する実験
ぎこちなくても、とにかくコードにしてみる
明示的になった素材を改善する設計技法
意図の明白なインタフェース
副作用のない関数
表明
概念の輪郭
独立したクラス
閉じた操作
表現を
改善する
ビジネスを
理解する
- 75. 第4部:大規模に長期的に取り組む
2019/3/22 ©有限会社 システム設計 75
14章
モデルの整合性を維持する
15章
蒸留
16章
大規模な構造
大規模・長期的に
取り組むための準備
境界づけられたコンテキスト
継続的な統合
コンテキストマップ
ビジネスルールの複雑さの整理と
モジュール構造の改善
コアドメイン
汎用的なサブドメイン
凝集されたメカニズム
ドメインビジョン声明文
コアのハイライト
コアの隔離
コアの抽象化
全体の関係を共通理解にする
モデル間の関係の整理と改善
責務のレイヤ
(能力・運用・約束・ポリシー)
知識レベルと運用レベル
- 78. 従来のアプローチ
• プロセスモデリング
• 機能分割
• トランザクションスクリプト
• データモデリング
• ERモデリング
• CRUD分析
• データベースアクセスのスクリプティング
• ビジネスルールの発見と整理が、主軸ではない
• その結果、ビジネスルールがあちこちにちらばり重複する
2019/3/22 ©有限会社 システム設計 78
- 92. エヴァンス本の構成
2019/3/22 ©有限会社 システム設計 92
第1部
ドメインモデルを
機能させる
第2部
モデル駆動設計の
構成要素
第3部
深い洞察に向かう
リファクタリング
第4部
戦略的設計
1章~3章 4章~7章 8章~13章 14章~17章
概論と基本事項
ここだけでは役に立たない
役に立つモデルを
手に入れるための
実用的な設計技法
大規模に適用する
長期的に取り組む
ための技法
- 103. 複雑さの核心に切り込む
• 既存の区分体系
• 未使用の区分
• 今となっては意図が不明な区分
• 複数の区分軸の混在
• 区分体系の整理
• 未使用を使わない
• 意図不明もいったん使わない
• 明らかな例外を、事前処理で除外する
• 残った区分を論理的に分解する
• 2軸か3軸の組み合わせになっていることが多い
• すべての組み合わせが網羅されていないことが多い(その理由を分析する)
2019/3/22 ©有限会社 システム設計 103
- 108. 2019/3/22 ©有限会社 システム設計 108
分割の軸 説明
予想される
アンチパターン
ビジネス能力
ビジネスアーキテクチャに合わせる
部門・業務・職務 (3段階の機能分割)
大きなきれいな絵と
入り組んだ現実のシステム構造
ドメインモデル
ビジネスルール単位で分割
・価格、割引、特典、…
・在庫引き当て、予約、キャンセル、…
ルールの依存性の整理の失敗
区分設計の失敗
アクション指向
アクション単位(イベント単位)に分割
引き合い、見積、在庫確認、受注、
出荷指示、売上計上、請求、…
手続き的なモジュール構造
ロジックがあちこちに重複
リソース指向
リソース単位に分割
リソース管理番号( Entity, URI )
FatなEntity/テーブル
巨大な中央データベース or
データの重複と不整合
- 120. VETRO
ビジネス
メッセージ
Event 通知、Document送付
Query 問い合わせ、Command 指示
Validation
妥当性検証
メッセージ内容の妥当性を検証する
データ形式、必須属性、値範囲、…
Enrich
情報付加
メッセージに含まれたIDなどから、関連する情報
を収集するルール(ex. 顧客ID->顧客購買履歴)
Translate
情報導出
付加された情報を元に、新たな情報を導出する
ルール (ex. 購買履歴 → 顧客ランク )
Routing
分岐判定
導出された情報を元に、適切なオペレーションに
分岐させるルール ( ex. 顧客ランクごとの対応 )
Operation
通知/記録
通知ルール:誰に何を通知すべきか?
記録ルール:どこに何を記録すべき?
2019/3/22 ©有限会社 システム設計 120
- 126. 事実の記録:データベース設計の基本
事実の記録の原則
• NULL という事実はない
• NOT NULL 制約にできないカラムは事実の記録として欠陥
• オプショナルな項目は、別テーブルにする
• 発生時点の異なる事実は、別テーブルにする
• 有効な値の範囲を定義する(型指向の設計)
外部キー制約には2つの意味がある
• 事実の前後関係(重要)
• 同じ時点の事実を別テーブルにしている関係(別事実に分解すべき可能性)
2019/3/22 ©有限会社 システム設計 126
- 128. 分離・独立を段階的に発展させる
テーブル → スキーマ → データベース
いきなりデータベース単位の分割を検討しない
1. 小さなテーブル単位に役割を分け、利用特性を明確にする
2. 同じ特性のテーブルをスキーマでグルーピング
3. スキーマ単位の参照権限・更新権限を徹底する
4. 独立性の高いスキーマを別データベースへの切り出しを検討する
2019/3/22 ©有限会社 システム設計 128
- 139. エヴァンス本の構成
2019/3/22 ©有限会社 システム設計 139
第1部
ドメインモデルを
機能させる
第2部
モデル駆動設計の
構成要素
第3部
深い洞察に向かう
リファクタリング
第4部
戦略的設計
1章~3章 4章~7章 8章~13章 14章~17章
概論と基本事項
ここだけでは役に立たない
役に立つモデルを
手に入れるための
実用的な設計技法
大規模に適用する
長期的に取り組む
ための技法