設計/ドメイン設計(1)
2023年5⽉18⽇
浅海智晴
クラウドアプリケーションのための
オブジェクト指向分析設計講座
第23回
作業分野
SimpleModeling2021
• オブジェクト指向分析設計での共通範囲
• UML/UP
• 本講座で使⽤するUMLプロファイル
• プロファイル:SimpleModeling2021 (SM2021)
• オブジェクト指向分析設計の基本からの拡張部を明確化
• アジャイル開発
• Communication
• Embrace Change
• Travel Light
• Scaling
• Component-Based Development
• クラウド・アプリケーション
• モデル駆動開発
SM2021
Travel Light
Embrace Change
Cloud
Model-Driven
Scaling
CBD
第1部 基本編の構成
• 概論 [第1回]
• 開発プロセス [第2回]
• 基本モデル [第3回]
• 静的モデル(1) [第4回]
• 静的モデル(2) [第5回]
• 動的モデル [第6回]
• 協調モデル [第7回]
• 関数モデル [第8回]
• 物理モデル [第9回]
• 作業分野 [第10回]
• ビジネス・モデリング [第11回]
• 要求 [第12回]
• 要求/ユースケース [第13回]
• 要求/シナリオ [第14回]
• 分析 [第15回]
• 分析/コンポーネント分析 [第16回]
• 分析/イベント駆動 [第17回]
• 作業分野
• 設計 [第18回]
• 設計/アーキテクチャ設計 [第19回]
• 設計/コンポーネント設計(1) [第20回]
• 設計/コンポーネント設計(2) [第21回]
• 設計/コンポーネント設計(3) [第22回]
• 設計/ドメイン設計(1) [第23回]
• 設計/ドメイン設計(2) [第24回]
• 設計/ドメイン設計(3) [第25回]
• 設計/ UX/UI設計 [第26回]
• 実装 [第27回]
• テスト [第28回]
• アプリケーション・アーキテクチャ [第29回]
• ドメイン・モデル [第30回]
• アプリケーション・モデル [第31回]
• プレゼンテーション・モデル [第32回]
• ケーススタディ[第33回]
• 要求モデル [第34回]
• 分析モデル [第35回]
• 設計モデル [第36回]
• 実装 [第37回]
• テスト [第38回]
本講座のアプローチ
• オブジェクト指向分析設計の基本を確認
• UML + UP(Unified Process)
• CBD (Component-Based Development)
• 最新技術でアップデート
• クラウド・コンピューティング
• イベント駆動、分散・並列
• ビッグデータ、AI、IoT
• コンテナ
• 関数型
• OFP(Object-Functional Programming), Reactive Streams
• ルール, AI
• DevOps
• アジャイル開発
• DX (Digital Transformation)
第25回 アプリケーション・アーキテクチャ
第2回 開発プロセス
第9回 物理モデル
第11回 ビジネス・モデリング
第2部 クラウド・アプリケーション編
第21回 設計/ドメイン設計
第20回 設計/コンポーネント設計
第2部 クラウド・アプリケーション編
本講座の選択
• プログラミング⾔語
• Scala
• Javaエコシステム
• Pythonを併⽤
• コンテナ
• Docker/Kubernetes
• CI/CD
• Daggar
• ミドルウェア
• AWS
• クラウド・プラットフォーム
• AWS
• アプリケーション・フレームワーク
• 本講座が定義する仮想的なアプリケーション・フレームワーク
• コンポーネント・フレームワーク
• クラウド・アプリケーション
• 関数型
原理 (Principle)
• Agile Software Development [ASD]
• SRP (The Single Responsibility Principle)
• OCP (The Open-Close Principle)
• LSP (The Liskov Substitution Principle)
• …
• GRASP (General Responsibility Assignment Software Patterns or Principals)
• Low Coupling
• High Cohesion
• …
• Writing Effective Use Cases [WEUC]
• Scope
• …
パターン (Pattern)
• Design Patterns [DP]
• Observer, Strategy, …
• Domain Driven Design [DDD]
• Ubiquitous Language, Intention-
Revealing Interfaces, …
• Analysis Patterns [AP]
• Party, Quantity, …
• Pattern-Oriented Software
Architecture [POSA]
• Layers, Pipes and Filters, …
• Patterns of Enterprise
Application Architecture [PEAA]
• Unit of Work, Data Transfer Object,
…
• Enterprise Integration Patterns
[EIP]
• Message Bus, Aggregator, …
• Patterns for Effective Use
Cases [PEUC]
• CompleteSingleGoal,
VerbPhraseName, …
• AntiPatterns [AnP]
• Stovepipe System, Analysis
Paralysis, …
オブジェクト指向の位置付け 第3回 基本モデル
作業分野とモデルの関係 第10回 作業分野
論理モデルの構成 第3回 基本モデル
内容
• ドメイン・モデル
• ドメイン設計
• 基本技術
• 関数の活⽤
• ドメイン・コンポーネント設計
• 伝票指向アーキテクチャ
ドメイン・モデル
ドメイン・モデル
• 現実世界の構造をソフトウェアで操作可能なモデルとして写し
取ったもの
• 主な構成
• エンティティ
• 永続オブジェクト
• バリュー
• サービス
• ルール
• イベント
現実世界からソフトウェア・モデルへ
現実世界を写し取る
• モノ・コト分析
• ⽤語集
• ユースケース
• 物語
• シナリオ分析
• Ubiquitous Language [DDD]
• エンジニアとビジネス側で共通の⾔語を持つ
三層アーキテクチャ 再掲 第20回 設計/コンポーネント設計(1)
ドメイン・モデルとアプリケーション・モデル
ドメイン設計
ドメイン設計
• ドメイン・モデル設計
• 現実世界の構造をソフトウェアで操作可能なドメイン・モデルとして
写し取る
• 次回予定
• ドメイン・コンポーネント設計
• ドメイン・モデルの操作を実現するメカニズムを設計
• コンポーネントとして実現
第24回 設計/ドメイン設計(2)
ドメイン設計に有効なパターン
• ドメイン・オブジェクト設計
• Analysis Patterns [AP]
• Domain Driven Design [DDD]
• ドメイン・コンポーネント設計
• Domain Driven Design [DDD]
• Patterns of Enterprise Application Architecture [PEAA]
分析オブジェクトのマッピング
基本技術
基本技術
• ドメイン・モデルの実現に限らず、オブジェクト・モデル全般
で有⽤な技術
• コンポーネント
• 物理モデル
• DTO
• 型クラス
• 関数
• Design Patterns [DP]
Supple Design [DDD] (柔軟な設計)
• Intention-Revealing Interfaces [DDD]
• 意図の明確なインタフェース
• Side-Effect Free Functions [DDD]
• 副作⽤なし関数
• Assertions [DDD]
• アサーション
• Standalone Classes [DDD]
• スタンドアロン・クラス
• Conceptual Contours [DDD]
• 概念的輪郭
関数の活⽤
関数の活⽤
• ドメイン・モデルでも関数技術を活⽤したい
• 代数的データ構造
• Monoid
• Monad
• 型クラス
• 計算と状態遷移の分離
• リアクティブ・ストリーム
オブジェクトと関数
再掲 第8回 関数モデル
サービスと関数
再掲 第8回 関数モデル
モナディック・パイプライン
(Monadic Pipeline) 本講座ではモナドを中⼼とした
マイクロ・フレームワークを
モナディック・パイプラインと呼びます。
再掲 第8回 関数モデル
Scala: for comprehension
• モナディック・パイプラインのためのシンタクスシュガー
def func(a: Int): Int =
val r: Option[Int] = for {
b <- f(a)
c <- g(b)
d = h(c)
e <- i(d)
} yield e
r.get
def f(x: Int): Option[Int] = ???
def g(x: Int): Option[Int] = ???
def h(x: Int): Int = ???
def i(x: Int): Option[Int] = ???
flatMapコンビネータ
mapコンビネータ
再掲 第8回 関数モデル
リアクティブ・ストリーム
• The Reactive Manifesto
• Reactive Streams
• ⾮同期ストリーム処理、バック
プレッシャー、ノンブロッキン
グ
• Akka Streams
• Reactive Stream & 関数
• FS2(Functional Stream for
Scala)
• Scalaz-stream
• ZStream
Cloud
再掲 第8回 関数モデル
リアクティブ・ストリームを
ZStream Monadで実現
ストリーミング
並⾏・⾮同期
リソース・セーフ
リジリエント
状態遷移
チャンク化
再掲 第8回 関数モデル
ドメイン・コンポーネント
設計
Domain Driven Design [DDD]
• 中軸
• Ubiquitous Language [DDD]
• Model-Driven Design [DDD]
• Supple Design (柔軟な設計)
• Building Blocks
• Context (⽂脈)
• Distillation (蒸留)
• Large-Scale Structure
Building Blocks [DDD]
• Layered Architecture [DDD]
• Entities [DDD]
• Value Objects [DDD]
• Services [DDD]
• Modules [DDD]
• Aggregates [DDD]
• Factories [DDD]
• Repositories [DDD]
永続オブジェクト
• Repository [PEAA, DDD]
• Identify Field [PEAA]
• Query Object [PEAA]
• Embedded Value [PEAA]
• Serialized LOB [PEAA]
O/Rマッピング
• インピーダンス・ミスマッチ
• インヘリタンスの扱い
• Single Table Inheritance [PEAA]
• Class Table Inheritance [PEAA]
• Concrete Table Inheritance [PEAA]
• 関連の扱い
• Foreign Key Mapping [PEAA]
• Association Table Mapping [PEAA]
• Dependent Mapping [PEAA]
メモリ内オブジェクト管理
• Identity Map [PEAA]
• Lazy Load [PEAA]
• Aggregates [DDD]
• データの⼊出⼒の単位となる
排他制御
• RDBMSのトランザクション管理が基本
• パターン
• Unit Of Work [PEAA]
• Optimistic Offline Lock [PEAA]
• Pessimistic Offline Lock [PEAA]
• Coarse-Grained Lock [PEAA]
• Implicit Lock[PEAA]
イベント駆動
• ドメイン・イベント
• エンティティに状態機械を設定
• 状態機械がドメイン・イベントに反応して処理を進める
第20回 設計/コンポーネント設計(1)
DSL (Domain Specific Language)
• ドメイン特化⾔語
• ドメインに特化して、ドメインの構造を簡潔に分かりやすく記述する
ことができる⾔語
• Declarative Style [DDD]
• 実現⽅式
• プログラミング⾔語組み込み
• Scala
• メタ⾔語 (XML, JSON)の上に構築
• 新規に⾔語を作成
第3部 モデル駆動開発編
Model-Driven
ドメイン・コンポーネントの構造(例)
伝票指向アーキテクチャ
伝票指向アーキテクチャ
• 本講座で推奨するドメイン・モデルを操作するアプリケーショ
ンのアーキテクチャ
• アプリケーション・アーキテクチャを考える際の補助線として
伝票 (Voucher)と台帳 (Ledger)を⽤いる
• クラウド・アプリケーションとの親和性
• CBD (Component-Based Development)
• マイクロ・サービス
• リアクティブ・ストリーム
SM2021
Cloud
CBD
メモリ上のエンティティ・オブジェクトを共有
伝票指向アーキテクチャ
伝票指向アーキテクチャとリアクティブ・ストリーム
まとめ
• ドメイン・モデル
• 現実世界を操作可能なモデルとして引き写す
• ドメイン設計
• ドメイン・モデル設計 → 次回
• ドメイン・コンポーネント設計
• 伝票指向アーキテクチャ
参考⽂献
• The Unified Modeling Language Reference Manual,
2nd (Rumbaugh他, 2004)
• The Unified Modeling Language User Guide, 2nd
(Booch他, 2004)
• The Unified Software Development Process
(Jacobson他, 1999)
• The Object Constraint Language, 2nd (Warmer他,
2003)
• UML 2 and the Unified Process: Practical Object-
Oriented Analysis and Design (Arlow他, 2005)
• OMG Unified Modeling Language Version 2.5
(OMG, 2015)
• 上流⼯程UMLモデリング (浅海, 2008)
• Domain-Driven Design: Tracking Complexity in
the Heart of Software (Evans, 2003)
• Applying Domain-Driven Design and Patterns :
With Examples in C# and .NET. (Nilsson, 2006)
• Analysis Patterns: Reusable Object Models (Fowler,
1996)
• Enterprise Patterns and MDA : Building Better
Software with Archetype Patterns and UML (Arlow
他, 2004)
• Patterns of Enterprise Application Architecture
(Fowler他, 2002)
• Design Patterns : Elements of Reusable Object-
Oriented Software (Gamma他, 1995)
• Functional and Reactive Domain Modeling (Ghosh,
2016)
• Functional Programming in Scala (Chiusano他,
2014)

設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】