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
かとじゅん
PRO
January 25, 2019
Programming
6
1.5k
ドメインモデリングワークショップ
ユースケースとドメインイベントを使ってモデリング・実装するワークショップの資料です
かとじゅん
PRO
January 25, 2019
Tweet
Share
More Decks by かとじゅん
See All by かとじゅん
私のキャリアの旅路: 技術をきっかけに変化を楽しむ
j5ik2o
PRO
3
590
いかに開発効率と品質を高めるか: ドメイン駆動設計と組織パターンの視点から考える
j5ik2o
PRO
2
1.5k
社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた
j5ik2o
PRO
1
1.3k
AWS データベースブログの記事 「Amazon DynamoDBによる CQRSイベントストアの構築」 を勝手に読み解く
j5ik2o
PRO
2
1.9k
EIPとAkkaについて
j5ik2o
PRO
3
2.2k
モデルを中心にデザイン(設計)すること
j5ik2o
PRO
2
2.2k
ドメインイベントの観点から再考するソフトウェア設計
j5ik2o
PRO
16
9.4k
セキュリティのためのソフトウェア設計について
j5ik2o
PRO
4
1.8k
AWS Dev Day 2021 - AWSでスケーラビリティとレジリエンスを実現するアーキテクチャを考える
j5ik2o
PRO
2
1.5k
Other Decks in Programming
See All in Programming
SwiftUI, Jetpack Composeの導入で変化した「家族アルバム みてね」のアプリ開発体験
hicka04
6
400
CSRF対策のやり方、そろそろアップデートしませんか / Update your knowledge of CSRF protection
hiro_y
25
15k
チームでモデリングを育てるうえで 考えたこと・気づいたこと / Cultivating Modeling in Teams: Thoughts and Insights
mackey0225
5
2.5k
Kotlinを用いたDSL的な設計手法と使用上の注意
kohii00
3
540
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
530
プロンプトエンジニアリング入門
tomokusaba
2
990
LPIXEL×CADDi_kaerururu
kaerururu
3
300
WebComponentsで フレームワークを1ページに共存させる
webuilder240
0
150
incrementalモデルの理解を深める
ikkimiyazaki
2
640
RubyVM を PHP で実装する 〜Hello World を出力するまで〜
memory1994
PRO
1
490
[スクリプト] Swiftの型推論を学ぼう
omochi
0
120
Migrating to Signals: A Practical Workshop
manfredsteyer
PRO
0
290
Featured
See All Featured
Practical Orchestrator
shlominoach
180
9.7k
Statistics for Hackers
jakevdp
789
220k
Mobile First: as difficult as doing things right
swwweet
215
8.5k
How GitHub Uses GitHub to Build GitHub
holman
467
290k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
16k
Writing Fast Ruby
sferik
619
59k
Into the Great Unknown - MozCon
thekraken
10
830
We Have a Design System, Now What?
morganepeng
42
6.7k
The Invisible Side of Design
smashingmag
293
49k
A designer walks into a library…
pauljervisheath
199
23k
Adopting Sorbet at Scale
ufuk
66
8.5k
Thoughts on Productivity
jonyablonski
57
3.8k
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