Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ドメインモデリングワークショップ
Search
かとじゅん
January 25, 2019
Programming
6
1.6k
ドメインモデリングワークショップ
ユースケースとドメインイベントを使ってモデリング・実装するワークショップの資料です
かとじゅん
January 25, 2019
Tweet
Share
More Decks by かとじゅん
See All by かとじゅん
メッセージとイベントを中核に置いたシステム設計の有用性について
j5ik2o
10
2.8k
私のキャリアの旅路: 技術をきっかけに変化を楽しむ
j5ik2o
3
770
いかに開発効率と品質を高めるか: ドメイン駆動設計と組織パターンの視点から考える
j5ik2o
3
2.3k
社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた
j5ik2o
2
1.7k
AWS データベースブログの記事 「Amazon DynamoDBによる CQRSイベントストアの構築」 を勝手に読み解く
j5ik2o
2
2.6k
EIPとAkkaについて
j5ik2o
3
2.5k
モデルを中心にデザイン(設計)すること
j5ik2o
2
2.6k
ドメインイベントの観点から再考するソフトウェア設計
j5ik2o
17
10k
セキュリティのためのソフトウェア設計について
j5ik2o
4
1.9k
Other Decks in Programming
See All in Programming
Dev ContainersとGitHub Codespacesの素敵な関係
ymd65536
1
140
推し活の ハイトラフィックに立ち向かう Railsとアーキテクチャ - Kaigi on Rails 2024
falcon8823
6
2.7k
外部システム連携先が10を超えるシステムでのアーキテクチャ設計・実装事例
kiwasaki
1
280
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
4
610
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.1k
EventSourcingの理想と現実
wenas
6
2.2k
シールドクラスをはじめよう / Getting Started with Sealed Classes
mackey0225
3
430
Better Code Design in PHP
afilina
PRO
0
110
『ドメイン駆動設計をはじめよう』のモデリングアプローチ
masuda220
PRO
8
510
ヤプリ新卒SREの オンボーディング
masaki12
0
110
ピラミッド、アイスクリームコーン、SMURF: 自動テストの最適バランスを求めて / Pyramid Ice-Cream-Cone and SMURF
twada
PRO
10
1.2k
cXML という電子商取引の トランザクションを支える プロトコルと向きあっている話
phigasui
3
2.3k
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Intergalactic Javascript Robots from Outer Space
tanoku
268
27k
Imperfection Machines: The Place of Print at Facebook
scottboms
264
13k
The Pragmatic Product Professional
lauravandoore
31
6.3k
Agile that works and the tools we love
rasmusluckow
327
21k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
400
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
The Cult of Friendly URLs
andyhume
78
6k
Navigating Team Friction
lara
183
14k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Teambox: Starting and Learning
jrom
133
8.8k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
Transcript
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 1/25 ドメインモデリングワークショップ かとじゅん(@j5ik2o) ドメインモデリングワークショップ 1 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 2/25 ChatWork テックリード github/j5ik2o scaladddbase scaladddbaseakkahttp.g8 reactiveredis
reactivememcached 翻訳レビュー エリックエヴァンスのドメイン駆動設計 Akka 実践バイブル 趣味 オンラインゲーム Final Fantasy XIV Monster Hunter World 自己紹介 ドメインモデリングワークショップ ドメインモデリングワークショップ 2 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 3/25 最近の発表ネタ 1. ドメインモデリングの始め方 AWS Dev
Day Tokyo 2018 ドメインオブジェクトの発見・実装・リファクタリングの方法論をカバー 2. Scala でのドメインモデリングのやり方 Scala 関西Summit 2018 1. のスライドと同様の観点だが、より実装技法寄りの議論をカバー 3. Scala コードとともに考えるドメインモデリング Scala 福岡 2019 ドメインイベントを利用したモデリングと実装 および 集約の結果整合性について 本ワークショップの回答例が含まれているので閲覧注意 ドメインモデリングワークショップ ドメインモデリングワークショップ 3 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 4/25 アジェンダ 目的の説明( 説明:10 分) アクターとユースケースの説明( 説明:20
分) ワークショップの進め方説明と質疑応答( 説明:5 分) ドメインモデルの分析( グループワーク:40 分) ドメインモデルの実装( グループワーク:40 分) ドメインモデルの設計レビュー( 全員で議論:40 分) チーム発表(40 分) ドメインモデリングワークショップ ドメインモデリングワークショップ 4 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 5/25 目的の説明 ドメイン駆動設計のモデルに基づく設計(モデル駆動設計)を体験する ドメインモデルを中心に議論し、実装することを体験する ドメインモデリングワークショップ ドメインモデリングワークショップ 5
/ 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 6/25 ウォレットサービス ユーザが電子マネーをウォレットという概念で管理できる サービス 某Kyash さんのようなサービスをイメージしてもらえ ば…
API サーバを開発する想定で考える 対象のドメイン ドメインモデリングワークショップ ドメインモデリングワークショップ 6 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 7/25 ウォレットサービスの概要 主な機能 ユーザがサインアップすると電子マネーを管理するウォレットが一つ作成される ユーザがクレジットカードなどからウォレットにチャージできる ユーザ間で請求や支払いができる(飲み会の割り勘のときに使える) 料金プランはパーソナルプランとファミリプランがあり、プラン変更もできる
ひとまずバーチャルクレジットカード払いのような機能は考えない ドメインモデリングワークショップ ドメインモデリングワークショップ 7 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 8/25 ユースケース分析 ドメインモデリングワークショップ ドメインモデリングワークショップ 8 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 9/25 一度にたくさんのことを議論すると終わらなくなるので、以下 に限定して始める アクター ユーザ ユースケース ユーザが、ウォレットにチャージできる(クレジット
カードなど) ユーザが、他のウォレットに支払う ユーザが、他のウォレットからの支払を受け取る ユーザが、ウォレットの残高を確認できる ユーザが、支払履歴を確認する 想定するユースケース(1) ドメインモデリングワークショップ ドメインモデリングワークショップ 9 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 10/25 想定するユースケース(2,3) 余裕があればこちらも考えてみる ユースケース(2) ユーザが、他のウォレットに請求する ユーザが、他のウォレットからの請求を受け取る ユーザが、請求履歴を確認する
ユースケース(3) ユーザが、プランをパーソナルプランもしくはファミリプランに切り替える ユーザが、ウォレットを追加/ 削除/ 一覧確認できる ユースケースのタイトル部分だけだと、具体的な仕様は曖昧なので、チーム内で議論する。最初はなるべく簡単に。 ドメインモデリングワークショップ ドメインモデリングワークショップ 10 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 11/25 ユーザが、他のウォレットに支払う 晴れの日コース ユーザは、支払ボタンをクリックする システムは、支払画面を表示する ユーザは、支払画面上に支払( 支払元ウォレットID,
支 払先ウォレットID 、名目、金額) を入力し、支払ボタ ンをクリックする システムは、受け取った支払から以下を行う 支払元ウォレットID をユーザが所有しているか確 認し、ストレージからウォレットを読み出す 支払元から支払先への支払を、支払元ウォレット に履歴として残す(To 側) 支払元から支払先への支払を、支払先ウォレット に履歴として残す(From 側) 雨の日コース 残高がマイナスになる請求はどうするのか? 雨の日コースから重要なビジネスルールを見つけることができ る FYI: ユースケース記述 ドメインモデリングワークショップ ドメインモデリングワークショップ 11 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 12/25 ビジネスルールに注目する ユースケース記述を議論しながら、ビジネスルールについても議論する 支払・請求は、誰から誰へ、名目、いくらかが分かる必要がある 支払には請求があるものとないものがある。請求がなくても支払はできる 残高がマイナスになる支払は行えるのか?行えないのか? プランでできること・できないこととは?
パーソナルは1 ウォレットのみ、ファミリは10 ウォレットのみ 契約ってどう表現するの?そもそも契約とは? ドメインモデリングワークショップ ドメインモデリングワークショップ 12 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 13/25 ワークショップの進め方 洗い出すもの = ( ドメインイベント, コマンド,
リードモデル, 集約( ドメインモデルを内包する)) 1. ドメインイベントを洗い出す 2. コマンドを洗い出す( コマンドによって起こる副作用を考える) 3. コマンドを発行するアクターを洗い出す( アクターがコマンドを発行するときや条件を考える=リードモデル) 4. その副作用を扱う、集約( ドメインモデル) を洗い出す ( 画像出典:https://en.wikipedia.org/wiki/Event_storming) ドメインモデリングワークショップ ドメインモデリングワークショップ 13 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 14/25 付箋の色を決める(以下, 例) ドメインイベント=オレンジ コマンド=ブルー アクター=イエロー 集約=グリーン
疑問点・注意点=何色でも 4 種類の色で分けられればOK ドメインモデリングワークショップ ドメインモデリングワークショップ 14 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 15/25 ワークショップでの議論 付箋にメモしながら議論する 付箋の図を作ることが目的ではない メンバー間の共通理解を得ることが目的 HTTP やRDB
などのインターフェイスレイヤの議論はしない ドメインモデリングワークショップ ドメインモデリングワークショップ 15 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 16/25 ドメインモデルの分析 ドメインイベントを洗い出す 基点となるドメイン上の出来事( ドメインイベント) を一つ選び、付箋にドメインイベント名を書いて貼り出す。 さらに前後に起こるドメインイベントをタイムライン状(
左から右に流れるように) に並べる。議論しながら抜け漏れがな いように 前後の依存関係はあるか? ドメインイベントの重複が起きても辻褄が合うか? ドメインイベントに含まれる情報はなにか?ドメインイベント名を書いた付箋の横に、どんな情報が含まれるか付箋を貼 ってみる ドメインモデリングワークショップ ドメインモデリングワークショップ 16 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 17/25 コマンドを洗い出す ドメインイベントは、どういうコマンド( 命令) が発行されると起きるかを議論する ドメインイベントの左側に、コマンド名を書いた付箋を貼り出す 勤怠管理:入室する
→ ★ → 入室した / 退室する → ★ → 退室した ほぼドメインイベントと1 対1 だが、場合によっては一つのコマンドで複数のドメインイベントが発生する場合もある コマンドに必要な情報はなにか?コマンド名を書いた付箋の横に、どんな情報が含まれるか付箋を貼ってみる ドメインモデリングワークショップ ドメインモデリングワークショップ 17 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 18/25 アクターを洗い出す コマンドを発行するアクターを洗い出す 付箋にアクター名を書いて、コマンドの左隣に貼り出す 今回の場合は、ユーザ ユーザが何をみてどんなときにコマンドを発行するか確認する リードモデルを洗い出す
ドメインモデリングワークショップ ドメインモデリングワークショップ 18 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 19/25 集約を洗い出す コマンド → 副作用 → ドメインイベント
勤怠管理: 入室する → 入室状態を入室済に変更 → 入室した コマンドを受け付け、内部で副作用を起こすオブジェクトに名前を付ける ユースケースから名前を探す。違和感があれば名前を作ってもよい 集約名は付箋に書いて、コマンドとドメインイベントの上に貼り出 集約名は重複してもよい。コマンド→ 副作用→ ドメインイベントに跨がる集約があるため。以下を部屋集約にまとめるこ ともありうる 勤怠管理: 入室する → 入室状態を入室済に変更 → 入室した 勤怠管理: 退室する → 入室状態を退出済に変更 → 退室した ドメインモデリングワークショップ ドメインモデリングワークショップ 19 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 20/25 FYI: ドメインオブジェクトのおさらい エンティティは、識別されるもの。みつけるとか特定するもの 値オブジェクトは、特徴を説明するもの エンティティ・値オブジェクトに属さない人工物。ドメインオブジェクトを使った関数 ただし、パターンに縛られない
ドメインモデリングワークショップ ドメインモデリングワークショップ 20 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 21/25 FYI: 集約の境界定義 集約は、強い整合性の境界を表現する(RDB ではトランザクション整合性) ユースケースによって、都合良く整合性の境界を広げたり、縮めたりしない。デッドロックの温床になりやすいので、モ デルをみれば整合性の境界が分かるようにする
FYI: こんなユースケースは要注意 結果的に集約の状態はRDB に永続化されるが、モデルレベルで整合性を整える。外部キー制約は強い整合性を使う集約の 中だけで考える 参考資料: FYI: 集約の境界定義 ドメインモデリングワークショップ ドメインモデリングワークショップ 21 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 22/25 ドメインモデルの実装 実装するもの 集約と、その内部に含めるドメインオブジェクト リポジトリの実装は不要。作ってもよい 成果物としては、クラス図 or
実装コード 実装の注意点 ウォレットのことはウォレットオブジェクトの実装みたら分かるようにする。あちこち調べさせない。ドメイン知識 (=判断、加工、計算)はドメインオブジェクトに紐付ける 集約の境界を明らかにすること。その集約のインスタンスが消えるときに一緒に消えるオブジェクトの範囲を明確に すること 集約は壊れてはいけないビジネスルールをきちんと守れる設計にすること( 契約プログラミング) 。ただし、現実的な 妥協は認められるものとする チャージ・支払の履歴の参照をどう扱うか? ドメインオブジェクトやリポジトリは複雑な問い合わせに対応せずに、 DAO に任せる方法もある ドメインモデリングワークショップ ドメインモデリングワークショップ 22 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 23/25 FYI: 結果整合性を扱う問題 ユースケース(3) は結果整合性を扱う問題。希に遭遇する問題ではなく、日常的にありえる。 集約を跨がる整合性の問題 ドメインモデリングワークショップ
ドメインモデリングワークショップ 23 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 24/25 ドメインモデルの設計レビュー 各チーム発表 どんな設計にしたか、なぜそうしたか? うまくいかなかったところ、うまくいったところ 全員で、うまくいかなかったところについて、改善提案などを行う ドメインモデリングワークショップ
ドメインモデリングワークショップ 24 / 25
2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 25/25 振り返り その場の雰囲気で振り返ります ドメインモデリングワークショップ ドメインモデリングワークショップ 25 /
25