Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
キッチハイク社内勉強会 ドメイン駆動設計のはなし / 2021-09-01
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
taogawa
September 24, 2021
Programming
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
キッチハイク社内勉強会 ドメイン駆動設計のはなし / 2021-09-01
taogawa
September 24, 2021
More Decks by taogawa
See All by taogawa
「一人でも多く、一円でも多く」 価値を届ける決済の仕組みと工夫 / 2022-11-30_10x_campfire_kanmu
taogawa
0
160
キッチハイク社内勉強会 / 2021-03-03
taogawa
0
1.2k
7年目を迎えたRails アプリケーションの傾向と対策/Rails Developers Meetup 2019 Day1
taogawa
8
4.4k
意図せぬレスポンスを防ぐAPI設計2つのコツ / Startup Rails #6
taogawa
0
2.8k
おいしい時間を支えるAPI設計 / Food Service Engineers Meetup #3
taogawa
1
2.8k
Other Decks in Programming
See All in Programming
DroidKnights 2026 Android A2UI Jetpack Compose 기반의 안전한 AI UI 렌더링 - 박제창
itsmedreamwalker
1
210
まずはコードより業務と向き合う:テーブル解体のためにPdMを呼んだ話
sakawe_ee
0
190
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.7k
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
370
Spec-driven Development with AI
simas
PRO
0
2.3k
protojson における文字化けの扱い
kazuki1023
0
230
Getting Started with Vibe Coding
miccheng
0
190
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.9k
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
170
ActionController meets Protocol Buffers
sorah
1
800
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
15
11k
느린 네트워크와 저사양 디바이스 사용자를 위한 웹뷰 로딩 시간 개선기
kmkim
1
220
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
750
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.4k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Fireside Chat
paigeccino
43
4.1k
Google's AI Overviews - The New Search
badams
0
1.7k
エンジニアに許された特別な時間の終わり
watany
109
250k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
600
Reality Check: Gamification 10 Years Later
codingconduct
0
2.4k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
430
Raft: Consensus for Rubyists
vanstee
143
7.9k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
470
Transcript
ドメイン駆動設計のはなし キッチハイク社内勉強会 2021/9/1 小川 剛
• ドメイン駆動設計ってなに? • DDD on Rails • 私たちにできること 本日はなすこと
ドメイン駆動設計ってなに?
• エリック・エヴァンス「ドメイン駆動設 計」(原著:2003)にて提唱された設計 手法に端を発する • ドメインに焦点をあてた設計手法 ドメイン駆動設計(DDD)とは
• ドメイン ◦ 知識、影響力、または活動の領域。ユーザーがプログラムを適用する対象領 域がソフトウェアのドメインとなる • モデル(ドメインモデル) ◦ あるドメインについて、そのうちの選択された側面を記述し、そのドメインに関 連する問題を解決するために使うことのできる、抽象化されたシステム。
( https://zenn.dev/takahashim/books/fb4cdc32f8e95c より引用 ) DDDのキー概念: ドメインとモデル
• ソフトウェア化の対象となるドメインの知識を深める • ドメインの知識を整理して、ドメインモデルに反映する • ドメインモデルをソフトウェアに反映する • これらを継続的に行っていくことでソフトウェアを設計・開発する手法であ る 改めてDDDとは
https://www.nri.com/-/media/Corporate/jp/Files/PDF/knowledge/publication/chitekishisan/2020/09/cs20200910.pdf を参考 DDDのサイクル ドメイン知識 ドメインモデル ソフトウェア ドメインエキスパート 開発者 ユビキタス言語
• ドメインエキスパート ◦ そのソフトウェアのドメインに対して、知識を持っている人 ◦ 例: 会計処理のドメインは会計担当の人が一番詳しい • ユビキタス言語 ◦
ドメインモデルを中心に構造化された言語 ◦ メンバーはユビキタス言語を統一してあらゆる場所で使うようにする DDDのサイクル
• 開発者とドメインエキスパートが対話しながら、ドメイン知識をドメインモデ ルに反映させ、成長させていく。 • このドメインモデルをソフトウェアとして実装していく • ドメインモデルは関係者のドメイン知識が深まったり、またドメインが改善 されていく中で、生き物のように変化していく • したがって、ドメインモデルを更新し続けていく継続的なプロセスである
DDDのサイクル
• 開発者とドメインエキスパートが対話しながら業務知識を深めていくこと で、より高いレベルでソフトウェアにドメイン知識を反映していくことができ る • ソフトウェアのドメイン知識が高凝集・疎結合であることで継続的なメンテ ナンス性が高まる DDDでどんないいことがあるの?
https://www.domainlanguage.com/wp-content/uploads/2016/04/Pattern-Language-Overview-med.png
DDDのアーキテクチャ要素 • たくさんある・・・ ◦ レイヤ化アーキテクチャ ◦ 値オブジェクト ◦ リポジトリ ◦
エンティティ ◦ 集約 ◦ サービス等々 • これらの詳細な説明は今回のスコープではないので、後の説明で出てくるもの だけご紹介します
• アプリケーションを以下4つの層に分割する ◦ プレゼンテーション層 ◦ アプリケーション層 ◦ ドメイン層 ◦ インフラストラクチャ層
• ドメイン層は、データアクセスのための技術的機 能(インフラストラクチャ)や、ユースケースの実行 (アプリケーション層)とは別の層に隔離されてい る レイヤ化アーキテクチャ https://ajlopez.wordpress.com/2008/09/12/layered-architecture-in-domain-driven-design/
リポジトリ class User attr_reader :id, :name, :email def initialize(name, email)
# ... end # ドメインロジック def signup # ... end end class UserRepository # 永続化層へのインターフェース def save(user) # ... end end # ドメインオブジェクトの永続化はリポジトリ経由で行う userRepository.save(user) • ドメインオブジェクトに対し、永続 化層(データベース等)へのアク セスを提供するもの • ドメインオブジェクトと永続化層 が疎結合になる • Active Recordの場合、モデル は永続化層(データベースの テーブル)をそのままラップした ものになる
• DDDで提唱されているアーキテクチャは、総じてドメイン層 / ドメインモデ ルをドメインロジックのみに純化するのが目的である(と思う) • ドメイン層がドメインロジックの表現のみに専念できるようにするため、責 務の異なるものは分離する • 責務の異なるものは別のドメインモデル、あるいは層に分けていく
DDDのアーキテクチャの目的
DDD on Rails
Ruby on RailsはDDDには 不向きと言われるけどどうなの
• 静的型付け言語のほうがドメインモデルのルールを型を通じて表現しやす いと言われている • 一方でRubyの表現力は、ドメインをコードに分かりやすく落とし込むことが 可能である。DSLが良い例。 • やりやすいところもあるし、やりにくいところもあるんじゃないかなという感 想 RubyとDDD
• Active Recordの制約 ◦ Active Recordはテーブル = エンティ ティを前提としている ◦
データベースの構造がドメインの構造と 密結合してしまう ◦ Repositoryを介したデータアクセスがし づらい DDD on Rails https://bliki-ja.github.io/pofeaa/ActiveRecord/
• もちろんRails自体はAR以外のORマッパーを使えるようになっている • だが、現状AR一強になっているために、それ以外の強力な選択肢が少な い • Active Recordを使うのであれば、ActiveRecordのモデルをインフラス トラクチャ層内に制限して、ドメイン層にモデルクラスを持たせるなどの工 夫が必要になる
DDD on Rails
• Hanami ◦ Clean Architectureベースのアーキテクチャ設計 • ROM(Ruby Object Mapper) ◦
上述のHanamiでも使用されているORM(公式はORMとは呼んでほ しくなさそう・・・) ◦ Entity / Repositoryの分離が前提となっている Rails / Active Record以外の選択肢
こうした議論はすごく楽しいけど どこか違和感
言語やフレームワークが DDDに向いている向いてないの前に やれることがあるんじゃないか
私たちにできること
DDDのアーキテクチャは何のため? • DDDのアーキテクチャに則っている = DDDができている、ではないはず • アーキテクチャは、ソフトウェアのドメインモデルの実装を疎結合・高凝集 にしていくためのものである • RailsではDDDのアーキテクチャが適用しにくい
= DDDができない、のよ うな短絡化を避けたいという思いもある
ドメイン知識 ドメインモデル ソフトウェア ドメインエキスパート 開発者 ユビキタス言語 アーキテクチャは この領域の 一部分でしかない
• アーキテクチャをあれこれ話すのは楽しい・・・でもDDD全体において、そ れは一部分の要素でしかない • よりよい設計・開発を目指すのであれば、もっと別の要素にも目を向けて いくべきではないのか • ドメインエキスパートとどう対話していくか、ドメインをどうモデリングしてい くかに着目できないか ◦
以降では特にドメインモデリングについて触れる アーキテクチャ以外の領域へ
ドメイン知識 ドメインモデル ソフトウェア ドメインエキスパート 開発者 ユビキタス言語 私たちは こちらにもっと着目すべきではな いか?
ドメインモデリングに向き合えている? • モデリングのプロセスを簡略化してしまっていないか • 現在のモデルに継ぎ足し継ぎ足しで考えるのが当たり前になっていない か • それらの積み重ねの結果として、モデルの無軌道な肥大化に繋がってい ないだろうか
よりよいドメインモデリングのために • DDD本では、具体的にどうドメインモデリングをすればよいかは書いてい ない • どのようにドメインモデリングをしていけばよいか?
ドメイン駆動設計 モデリング / 実践ガイド • とっても良い本です・・・! • この本では、ユースケース図 / ドメ
インモデル図をもとに、実装に反映 させていくアプローチを取っている
「ドメイン駆動設計 モデリング / 実践ガイド」で のプロセス概要 • モデルが解決する課題を具体化するため にユースケース図を起こす • ドメインモデル図を起こして、集約の範囲
や関連などを可視化する • ドメインモデルを実装する • 実装の知見をもとにドメインモデルを改善 していく ドメインモデリングのプロセス
モデリングスキルのレベルアップ • モデリングに対して先人がどう向き合ってきた か • UMLモデリング、データモデリングのプロセス から学ぶ ◦ 概念をいかにしてモデル化していくか •
特定ユースケースにおいて定石となるモデリン グパターンから学ぶ ◦ アナリシスパターン
• DDDとはドメインエキスパートとの対話を通じて、ドメインモデルを深化さ せ、継続的に反映していくプロセスである • DDDについてはアーキテクチャについつい目が行きがちであるが、それら はソフトウェアのドメインをいかに疎結合・高凝集にしていくための手段で ある • ドメインをどうモデリングしていくかの技法について、私たちはまだまだ学 ぶことがあるはず
まとめ