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.7k
ドメインモデリングワークショップ
ユースケースとドメインイベントを使ってモデリング・実装するワークショップの資料です
かとじゅん
January 25, 2019
Tweet
Share
More Decks by かとじゅん
See All by かとじゅん
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
10
3.7k
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
7
780
メッセージとイベントを中核に置いたシステム設計の有用性について
j5ik2o
12
3.1k
私のキャリアの旅路: 技術をきっかけに変化を楽しむ
j5ik2o
3
840
いかに開発効率と品質を高めるか: ドメイン駆動設計と組織パターンの視点から考える
j5ik2o
3
2.6k
社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた
j5ik2o
2
1.9k
AWS データベースブログの記事 「Amazon DynamoDBによる CQRSイベントストアの構築」 を勝手に読み解く
j5ik2o
2
2.8k
EIPとAkkaについて
j5ik2o
3
2.6k
モデルを中心にデザイン(設計)すること
j5ik2o
2
2.8k
Other Decks in Programming
See All in Programming
定理証明プラットフォーム lapisla.net
abap34
1
1.8k
仕様変更に耐えるための"今の"DRY原則を考える / Rethinking the "Don't repeat yourself" for resilience to specification changes
mkmk884
0
190
GAEログのコスト削減
mot_techtalk
0
120
責務と認知負荷を整える! 抽象レベルを意識した関心の分離
yahiru
3
520
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
230
SpringBoot3.4の構造化ログ #kanjava
irof
2
1k
2024年のWebフロントエンドのふりかえりと2025年
sakito
3
250
AWS Organizations で実現する、 マルチ AWS アカウントのルートユーザー管理からの脱却
atpons
0
150
Honoとフロントエンドの 型安全性について
yodaka
7
1.2k
CI改善もDatadogとともに
taumu
0
120
Ruby on cygwin 2025-02
fd0
0
150
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
250
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Automating Front-end Workflow
addyosmani
1368
200k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Fireside Chat
paigeccino
34
3.2k
Gamification - CAS2011
davidbonilla
80
5.1k
Six Lessons from altMBA
skipperchong
27
3.6k
Visualization
eitanlees
146
15k
The Pragmatic Product Professional
lauravandoore
32
6.4k
Side Projects
sachag
452
42k
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