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
DDDとRDRAを組み合わせて使うには
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
かとじゅん
September 24, 2019
Programming
5k
11
Share
DDDとRDRAを組み合わせて使うには
RDRA1.0とDDDを組み合わせた経験から以下の観点 について解説
1) いきなりドメインモデルを考えられるか
2) ドメインモデルの周辺環境を探索する
かとじゅん
September 24, 2019
More Decks by かとじゅん
See All by かとじゅん
終盤で崩壊させないAI駆動開発
j5ik2o
3
2.5k
CQRS/ESになぜアクターモデルが必要なのか
j5ik2o
0
1.9k
メッセージ駆動が可能にする結合の最適化
j5ik2o
10
6.5k
曖昧なプロンプトでも正しいコードが書ける理由
j5ik2o
0
500
AIコーディングエージェントの現実と設計品質の重要性
j5ik2o
0
150
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
17
8.2k
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
8
1.6k
メッセージとイベントを中核に置いたシステム設計の有用性について
j5ik2o
12
4.4k
私のキャリアの旅路: 技術をきっかけに変化を楽しむ
j5ik2o
3
1.1k
Other Decks in Programming
See All in Programming
20260514 - build with ai 2026 - build LINE Bot with Gemini CLI
line_developers_tw
PRO
0
400
実践ハーネスエンジニアリング:ステアリングループを実例から読み解く / Practical Harness Engineering: Understanding Steering Loops Through Real-World Examples
nrslib
5
5.1k
🦞OpenClaw works with AWS
licux
1
350
書き換えて学ぶTemporal #fukts
pirosikick
2
370
サークル参加から学ぶ、小さな事業の回し方
yuzneri
0
160
[RubyKaigi 2026] Require Hooks
palkan
1
310
継続的な負荷検証を目指して
pyama86
3
1.1k
開発とはなにか、Essenceカーネルで見えるもの
ukin0k0
0
130
Liberating Ruby's Parser from Lexer Hacks
ydah
2
2.7k
tRPCの概要と少しだけパフォーマンス
misoton665
2
270
AIを導入する前にやるべきこと
negima
2
350
PicoRuby for IoT: Connecting to the Cloud with MQTT
yuuu
2
770
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
6.8k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
200
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
150
Navigating Weather and Climate Data
rabernat
0
190
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
140
Between Models and Reality
mayunak
3
280
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
300
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
280
Thoughts on Productivity
jonyablonski
76
5.1k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Transcript
DDDとRDRAを組み合わせて使うには かとじゅん(@j5ik2o) BPStudy
© Chatwork あなた誰? • 加藤潤一(@j5ik2o) • Chatwork社のテックリード ◦ 2016年末メッセージング基盤を刷新。k8s, Akka,
Kafka, HBaseを使ったEvent Sourcing システムをリリース済み ◦ PHPからScalaへのレガシーシステム移行プロ ジェクトやってます。 • RDRAを知ったきっかけ ◦ DDDのコミュニティのメンバーからの紹介
© Chatwork 最近の活動 • #チケット料金モデリング ◦ 映画の料金を決定するモデルを実装する ◦ 値オブジェクトの設計に注力する ▪
DBやWebAPIなどの入出力は一旦忘れる ◦ セプテーニさん、オプトさんでも自主開催してくれた • Qiita:ドメインロジックはドメインオブジェクトに凝集させる ◦ 内部データをそのまま暴露するGetterは貧血症の温床になるので気 を付けろ的な話 • DDD Radioで出演 ◦ 日曜に128人ぐらいライブ方法で集まった。#dddcj
© Chatwork アジェンダ • RDRA1.0とDDDを組み合わせた経験から以下の観点 について解説 ◦ いきなりドメインモデルを考えられるか ◦ ドメインモデルの周辺環境を探索する
▪ システム境界 ▪ システム外部環境 ▪ システム価値
© Chatwork FYI: ドメインモデルとは? • 期日モデルの場合 ◦ 期日は単なる日時ではない。期日は未来を指定する。期日は 約束事に含まれる ◦
たとえば請求に含まれるのは支払期日。支払期日は請求日に 依存する。請求日から30日以内など。 • 注文などの数量モデルの場合 ◦ ただの整数ではない。Intにした場合は-21億~21億。だいた いは要件にあっていない。0~999など。 • DDDでは問題を解く考え方(モデル)を型に落とし込む。分析と設 計(実装)を単一のモデルとして扱う。例えば請求クラスでは支払 期日クラスのインスタンスが内包される可能性が高い
© Chatwork いきなりドメインモデルを考えれるか • 初見だと無理に近い。ドメインモデルの目的と か背景がわからないと考えられない(当然 • ドメインモデルには抽象化のための選択と集中 がある。こういった戦略をどこから導けばよい か?
• ドメインモデル自体は導かれた結果なので、ド メインモデルの外側に目を向けなければならな い • ブログ記事:ドメインモデルの根拠とドメインモ デル貧血症の対策について
© Chatwork ドメインの根拠は外部環境から探る必要がある • ドメインモデルがどのような目的で使われるか知るには、周辺環境を理 解することが求められる。RDRAはそのための手法の一つ システム システム価値 システム外部環境 システム境界
ドメイン モデル ドメイン モデル ドメイン モデル 外部システム イベント ユースケース 情 報 情 報 業務フロー/ 利用シーン
© Chatwork ドメインモデルの周辺環境を探索する • 通常は、システム価値→システム外部環境→システム境界→システムの 流れだが、ドメインを中心に考えて逆に辿りながら考える • Chatworkでの事例も交えながら簡単に解説 ◦ OAuth2認可サーバの開発案件
◦ OAuth2がわからない人は、API利用のための認可機構だと思ってく ださい。認可=誰に何を許可するかという問題
© Chatwork システム境界 • システムの外部と内部の境界線を明らかにし、システ ムの範囲を明確にする
© Chatwork ユースケースモデル • 人間とシステムの対話を明らか にすることでシステムの範囲を 明確にできる • ユースケース記述には、ビジネ ス上で利用される概念モデルが
含まれる。そういった概念を説 明するために利用される用語が ユビキタス言語となる • 認可APIサーバのトークンエンドポイント(B) ◦ は、クライアント(E)を認証する(C) ◦ は、認可コード(E)をリポジトリから読 み込み・削除する(C) ◦ は、認可コード(E)を検証する(C) ◦ は、認可コード(E)のリダイレクトURIと トークンリクエストのリダイレクトURI を検証する(C) ◦ は、アクセストークン(E)を生成する ◦ は、クライアント(E)にトークンレスポ ンスを返す(C) OAuthプロジェクトの例 用語の候補はRFCや操作マニュアルから得 られることも多い
© Chatwork FYI: システム境界とBCEステレオタイプ • 外側から内側の対話を意識する ◦ アクターとシステムの対話(外側から内側の対話)が示されている こと。必要に応じて、GUIモックアップを書く。 •
ユースケース記述を、BCE(Boundary-Control-Entity)ステレオタイプで 表現する。 ◦ 名詞は、エンティティか、バウンダリオブジェクトになる。 ◦ 動詞は、オブジェクト間のメッセージです。これは実装すべきソフト ウェア機能(コントロール)を示している。 エンティティ (ドメインオブジェクト ) バウンダリ コントロール (メッセージ) 名詞(オブジェクト) 動詞(処理) アクター システム アクション 応答 システム境界 業務上の動詞 に注目する。
© Chatwork FYI: イベントからドメインモデルを分析する • RDRA1.0にもシステム境界の 段階ではユースケース以外に イベントモデルを分析する方 法もある •
業務でどんな出来事(イベント) が起きるかに注目する。何が 発生したか。イベントの種 類、イベントが起きた時点な どからドメインモデルを分析 することができる CartCreated CartItemAdded CartItemUpdated CartItemRemoved CartCreatedにはカートIDや顧客IDや作成日 時などが含まれる。さらにどのような命令でイ ベントが起きるかを分析することができる。コマ ンドを受け取るのがドメインオブジェクト
© Chatwork ユースケースを見つけるには • ドメインモデルをいきなり見つけることが難しいように、ユースケース も同様。RDRAでは業務フローや利用シーンから根拠を見つけることがで きる
© Chatwork システム外部環境 • システムを取り巻く外部環境として、業務フロー・利用シーン、および 関連する概念をモデル化する
© Chatwork 利用シーン • 利用シーン(汎用的なツールな ど) ◦ システムはどのようなシー ンで利用されるか ◦
利害関係者との繋がりを示 す • ユビキタス言語の候補が見つか る • リソースオーナー ◦ クライアントを利用したい ▪ OAuth2のフローに従いリソース オーナーはクライアントに認可を 与えることができること ◦ 認可を与えたクライアントを管理した い ▪ 認可を与えたクライアントの一覧 を管理画面から確認でき、必要で あればその認可を失効できること OAuthプロジェクトの例
© Chatwork 概念モデル • 業務上で使われる概念を明示的 に定義する • 概念モデルの把握には以下の方 法などを使う ◦
声に出してテスト ◦ ホワイトボードなどに説明 のためのモデル図を書く • 用語間の結びつきに注意する • 代表的な集約(グローバルなエンティティ) ◦ クライアント ◦ 予約済み認可 ◦ 認可 ◦ 認可コード ◦ 定義済みスコープ • 代表的な値オブジェクト ◦ 組織ID ◦ アカウントID ◦ クライアントスコープ ◦ リダイレクトURI ◦ アクセストークン OAuthプロジェクトの例
© Chatwork そもそもコアドメインで仕事をしているだろうか • 組織を成功に導くためのドメインがコアドメイン。そのコアドメインの 境界づけられたコンテキストに属するシステムの価値はどう定義される か? • これも、RDRAのシステム価値のパターンを使って整理・把握することが できる
© Chatwork システム価値 • システムと関係を持つ利害関係 者や外部システム、およびシス テムに対する要求を洗い出す • インセプションデッキやPRDにも 同様の事柄が記述される。この
ようなドキュメントでコアドメ インで仕事をしているか確認す ることができる • 価値・役割 ◦ ChatWork上でOAuth2認証・認可を実現すること • 関係者・組織 ◦ システムに関わるのは、顧客組織、その組織内の管 理者(組織管理者)、リソースオーナー(CWユー ザー)、OAuth2クライアント開発者(以下、クライ アント開発者)など • 外部システム ◦ 外部システムには、ユーザーエージェント、 OAuth2クライアント(以下、クライアント)、現行 のPHPシステムなど • 抱える問題・課題 ◦ 現行APIトークンより、安全な認証・認可の基盤を 実現すること。 • 実現する要件 ◦ 組織管理者の管理下のもと、自由にクライアントを 開発でき、業務効率化を図ることができる OAuthプロジェクトの例
© Chatwork • システムへの要求を発生させる元となる利害関 係者・外部システムを洗い出すために、コンテ キストモデルを作成する コンテキストモデル • 関係するシステム ◦
認可管理ツール(改修対象, PHP) ◦ 認可APIサーバ(開発対象, Scala) ◦ 認可Webサーバ(開発対象, PHP) ◦ リソースサーバ(API)(改修対象, PHP) ◦ クライアント(開発対象外) • 利害関係者 ◦ 顧客組織側 ▪ 組織管理者 ▪ 組織内のクライアント開発者 ▪ 組織内のリソースオーナー ◦ 開発側 ▪ 認可APIサーバチーム ▪ 認可Webサーバ/リソースサーバ チーム ▪ 現行PHPチーム ▪ インフラチーム
© Chatwork 要求モデル • 各アクターが持つ機能要求・ 非機能要求を洗い出す。ま た、要望・要求・要件は以下 のとおり明確に区別する ◦ 要望は思いつきのレベル
◦ 要求は検討対象 ◦ 要件は開発対象 • この段階でドメインとしての 価値があるかも考えることが できる。 • クライアント開発者 ◦ OAuth2を使ってクライアントを開発・運 用したい ▪ クライアント開発者になりたい ▪ クライアントを効率的に開発したい ▪ クライアントの運用を管理したい • リソースオーナー ◦ クライアントを利用・管理したい ▪ CWアカウントでクライアントの利用 したい ▪ 利用中のクライアントを管理したい OAuthプロジェクトの要望例
© Chatwork まとめ • 当然のことですが、ドメインモデルを探求するには要求が必要。ドメイ ンモデルと要求をトレースする(特にWhyのつながりのトレース)ため に、RDRAが使えるのでDDDを実践する人にもお勧めです
© Chatwork ご清聴ありがとうございました!
None