Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ドメインモデリングワークショップ

 ドメインモデリングワークショップ

ユースケースとドメインイベントを使ってモデリング・実装するワークショップの資料です

933291444e456bfb511a66a2fa9c6929?s=128

かとじゅん

January 25, 2019
Tweet

Transcript

  1. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 1/25 ドメインモデリングワークショップ かとじゅん(@j5ik2o) ドメインモデリングワークショップ 1 / 25

  2. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 2/25 ChatWork テックリード github/j5ik2o scala­ddd­base scala­ddd­base­akka­http.g8 reactive­redis

    reactive­memcached 翻訳レビュー エリックエヴァンスのドメイン駆動設計 Akka 実践バイブル 趣味 オンラインゲーム Final Fantasy XIV Monster Hunter World 自己紹介 ドメインモデリングワークショップ ドメインモデリングワークショップ 2 / 25
  3. 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
  4. 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
  5. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 5/25 目的の説明 ドメイン駆動設計のモデルに基づく設計(モデル駆動設計)を体験する ドメインモデルを中心に議論し、実装することを体験する ドメインモデリングワークショップ ドメインモデリングワークショップ 5

    / 25
  6. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 6/25 ウォレットサービス ユーザが電子マネーをウォレットという概念で管理できる サービス 某Kyash さんのようなサービスをイメージしてもらえ ば…

    API サーバを開発する想定で考える 対象のドメイン ドメインモデリングワークショップ ドメインモデリングワークショップ 6 / 25
  7. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 7/25 ウォレットサービスの概要 主な機能 ユーザがサインアップすると電子マネーを管理するウォレットが一つ作成される ユーザがクレジットカードなどからウォレットにチャージできる ユーザ間で請求や支払いができる(飲み会の割り勘のときに使える) 料金プランはパーソナルプランとファミリプランがあり、プラン変更もできる

    ひとまずバーチャルクレジットカード払いのような機能は考えない ドメインモデリングワークショップ ドメインモデリングワークショップ 7 / 25
  8. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 8/25 ユースケース分析 ドメインモデリングワークショップ ドメインモデリングワークショップ 8 / 25

  9. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 9/25 一度にたくさんのことを議論すると終わらなくなるので、以下 に限定して始める アクター ユーザ ユースケース ユーザが、ウォレットにチャージできる(クレジット

    カードなど) ユーザが、他のウォレットに支払う ユーザが、他のウォレットからの支払を受け取る ユーザが、ウォレットの残高を確認できる ユーザが、支払履歴を確認する 想定するユースケース(1) ドメインモデリングワークショップ ドメインモデリングワークショップ 9 / 25
  10. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 10/25 想定するユースケース(2,3) 余裕があればこちらも考えてみる ユースケース(2) ユーザが、他のウォレットに請求する ユーザが、他のウォレットからの請求を受け取る ユーザが、請求履歴を確認する

    ユースケース(3) ユーザが、プランをパーソナルプランもしくはファミリプランに切り替える ユーザが、ウォレットを追加/ 削除/ 一覧確認できる ユースケースのタイトル部分だけだと、具体的な仕様は曖昧なので、チーム内で議論する。最初はなるべく簡単に。 ドメインモデリングワークショップ ドメインモデリングワークショップ 10 / 25
  11. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 11/25 ユーザが、他のウォレットに支払う 晴れの日コース ユーザは、支払ボタンをクリックする システムは、支払画面を表示する ユーザは、支払画面上に支払( 支払元ウォレットID,

    支 払先ウォレットID 、名目、金額) を入力し、支払ボタ ンをクリックする システムは、受け取った支払から以下を行う 支払元ウォレットID をユーザが所有しているか確 認し、ストレージからウォレットを読み出す 支払元から支払先への支払を、支払元ウォレット に履歴として残す(To 側) 支払元から支払先への支払を、支払先ウォレット に履歴として残す(From 側) 雨の日コース 残高がマイナスになる請求はどうするのか? 雨の日コースから重要なビジネスルールを見つけることができ る FYI: ユースケース記述 ドメインモデリングワークショップ ドメインモデリングワークショップ 11 / 25
  12. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 12/25 ビジネスルールに注目する ユースケース記述を議論しながら、ビジネスルールについても議論する 支払・請求は、誰から誰へ、名目、いくらかが分かる必要がある 支払には請求があるものとないものがある。請求がなくても支払はできる 残高がマイナスになる支払は行えるのか?行えないのか? プランでできること・できないこととは?

    パーソナルは1 ウォレットのみ、ファミリは10 ウォレットのみ 契約ってどう表現するの?そもそも契約とは? ドメインモデリングワークショップ ドメインモデリングワークショップ 12 / 25
  13. 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
  14. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 14/25 付箋の色を決める(以下, 例) ドメインイベント=オレンジ コマンド=ブルー アクター=イエロー 集約=グリーン

    疑問点・注意点=何色でも 4 種類の色で分けられればOK ドメインモデリングワークショップ ドメインモデリングワークショップ 14 / 25
  15. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 15/25 ワークショップでの議論 付箋にメモしながら議論する 付箋の図を作ることが目的ではない メンバー間の共通理解を得ることが目的 HTTP やRDB

    などのインターフェイスレイヤの議論はしない ドメインモデリングワークショップ ドメインモデリングワークショップ 15 / 25
  16. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 16/25 ドメインモデルの分析 ドメインイベントを洗い出す 基点となるドメイン上の出来事( ドメインイベント) を一つ選び、付箋にドメインイベント名を書いて貼り出す。 さらに前後に起こるドメインイベントをタイムライン状(

    左から右に流れるように) に並べる。議論しながら抜け漏れがな いように 前後の依存関係はあるか? ドメインイベントの重複が起きても辻褄が合うか? ドメインイベントに含まれる情報はなにか?ドメインイベント名を書いた付箋の横に、どんな情報が含まれるか付箋を貼 ってみる ドメインモデリングワークショップ ドメインモデリングワークショップ 16 / 25
  17. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 17/25 コマンドを洗い出す ドメインイベントは、どういうコマンド( 命令) が発行されると起きるかを議論する ドメインイベントの左側に、コマンド名を書いた付箋を貼り出す 勤怠管理:入室する

    → ★ → 入室した / 退室する → ★ → 退室した ほぼドメインイベントと1 対1 だが、場合によっては一つのコマンドで複数のドメインイベントが発生する場合もある コマンドに必要な情報はなにか?コマンド名を書いた付箋の横に、どんな情報が含まれるか付箋を貼ってみる ドメインモデリングワークショップ ドメインモデリングワークショップ 17 / 25
  18. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 18/25 アクターを洗い出す コマンドを発行するアクターを洗い出す 付箋にアクター名を書いて、コマンドの左隣に貼り出す 今回の場合は、ユーザ ユーザが何をみてどんなときにコマンドを発行するか確認する リードモデルを洗い出す

    ドメインモデリングワークショップ ドメインモデリングワークショップ 18 / 25
  19. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 19/25 集約を洗い出す コマンド → 副作用 → ドメインイベント

    勤怠管理: 入室する → 入室状態を入室済に変更 → 入室した コマンドを受け付け、内部で副作用を起こすオブジェクトに名前を付ける ユースケースから名前を探す。違和感があれば名前を作ってもよい 集約名は付箋に書いて、コマンドとドメインイベントの上に貼り出 集約名は重複してもよい。コマンド→ 副作用→ ドメインイベントに跨がる集約があるため。以下を部屋集約にまとめるこ ともありうる 勤怠管理: 入室する → 入室状態を入室済に変更 → 入室した 勤怠管理: 退室する → 入室状態を退出済に変更 → 退室した ドメインモデリングワークショップ ドメインモデリングワークショップ 19 / 25
  20. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 20/25 FYI: ドメインオブジェクトのおさらい エンティティは、識別されるもの。みつけるとか特定するもの 値オブジェクトは、特徴を説明するもの エンティティ・値オブジェクトに属さない人工物。ドメインオブジェクトを使った関数 ただし、パターンに縛られない

    ドメインモデリングワークショップ ドメインモデリングワークショップ 20 / 25
  21. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 21/25 FYI: 集約の境界定義 集約は、強い整合性の境界を表現する(RDB ではトランザクション整合性) ユースケースによって、都合良く整合性の境界を広げたり、縮めたりしない。デッドロックの温床になりやすいので、モ デルをみれば整合性の境界が分かるようにする

    FYI: こんなユースケースは要注意 結果的に集約の状態はRDB に永続化されるが、モデルレベルで整合性を整える。外部キー制約は強い整合性を使う集約の 中だけで考える 参考資料: FYI: 集約の境界定義 ドメインモデリングワークショップ ドメインモデリングワークショップ 21 / 25
  22. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 22/25 ドメインモデルの実装 実装するもの 集約と、その内部に含めるドメインオブジェクト リポジトリの実装は不要。作ってもよい 成果物としては、クラス図 or

    実装コード 実装の注意点 ウォレットのことはウォレットオブジェクトの実装みたら分かるようにする。あちこち調べさせない。ドメイン知識 (=判断、加工、計算)はドメインオブジェクトに紐付ける 集約の境界を明らかにすること。その集約のインスタンスが消えるときに一緒に消えるオブジェクトの範囲を明確に すること 集約は壊れてはいけないビジネスルールをきちんと守れる設計にすること( 契約プログラミング) 。ただし、現実的な 妥協は認められるものとする チャージ・支払の履歴の参照をどう扱うか? ドメインオブジェクトやリポジトリは複雑な問い合わせに対応せずに、 DAO に任せる方法もある ドメインモデリングワークショップ ドメインモデリングワークショップ 22 / 25
  23. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 23/25 FYI: 結果整合性を扱う問題 ユースケース(3) は結果整合性を扱う問題。希に遭遇する問題ではなく、日常的にありえる。 集約を跨がる整合性の問題 ドメインモデリングワークショップ

    ドメインモデリングワークショップ 23 / 25
  24. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 24/25 ドメインモデルの設計レビュー 各チーム発表 どんな設計にしたか、なぜそうしたか? うまくいかなかったところ、うまくいったところ 全員で、うまくいかなかったところについて、改善提案などを行う ドメインモデリングワークショップ

    ドメインモデリングワークショップ 24 / 25
  25. 2019/1/25 localhost:4100/presentation.html#1 http://localhost:4100/presentation.html#1 25/25 振り返り その場の雰囲気で振り返ります ドメインモデリングワークショップ ドメインモデリングワークショップ 25 /

    25