Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ドメインモデリングワークショップ
Search
かとじゅん
January 25, 2019
Programming
6
1.8k
ドメインモデリングワークショップ
ユースケースとドメインイベントを使ってモデリング・実装するワークショップの資料です
かとじゅん
January 25, 2019
Tweet
Share
More Decks by かとじゅん
See All by かとじゅん
メッセージ駆動が可能にする結合の最適化
j5ik2o
9
1.8k
曖昧なプロンプトでも正しいコードが書ける理由
j5ik2o
0
400
AIコーディングエージェントの現実と設計品質の重要性
j5ik2o
0
110
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
16
7.6k
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
8
1.4k
メッセージとイベントを中核に置いたシステム設計の有用性について
j5ik2o
12
4.1k
私のキャリアの旅路: 技術をきっかけに変化を楽しむ
j5ik2o
3
960
いかに開発効率と品質を高めるか: ドメイン駆動設計と組織パターンの視点から考える
j5ik2o
5
3k
社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた
j5ik2o
2
2.2k
Other Decks in Programming
See All in Programming
251126 TestState APIってなんだっけ?Step Functionsテストどう変わる?
east_takumi
0
300
ローターアクトEクラブ アメリカンナイト:川端 柚菜 氏(Japan O.K. ローターアクトEクラブ 会長):2720 Japan O.K. ロータリーEクラブ2025年12月1日卓話
2720japanoke
0
530
Socio-Technical Evolution: Growing an Architecture and Its Organization for Fast Flow
cer
PRO
0
270
AIコーディングエージェント(skywork)
kondai24
0
120
sbt 2
xuwei_k
0
200
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
8
19k
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
210
『実践MLOps』から学ぶ DevOps for ML
nsakki55
2
560
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
25
21k
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
150
Microservices rules: What good looks like
cer
PRO
0
600
NUMA環境とコンテナランタイム ― youki における Linux Memory Policy 実装
n4mlz
1
110
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
A better future with KSS
kneath
240
18k
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
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