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
キッチハイク社内勉強会 ドメイン駆動設計のはなし / 2021-09-01
Search
taogawa
September 24, 2021
Programming
1.7k
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
140
キッチハイク社内勉強会 / 2021-03-03
taogawa
0
1.2k
7年目を迎えたRails アプリケーションの傾向と対策/Rails Developers Meetup 2019 Day1
taogawa
8
4.3k
意図せぬレスポンスを防ぐAPI設計2つのコツ / Startup Rails #6
taogawa
0
2.8k
おいしい時間を支えるAPI設計 / Food Service Engineers Meetup #3
taogawa
1
2.7k
Other Decks in Programming
See All in Programming
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
140
ふつうのFeature Flag実践入門
irof
8
4.1k
Webフレームワークの ベンチマークについて
yusukebe
0
170
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
AI 輔助遺留系統現代化的經驗分享
jame2408
1
800
RTSPクライアントを自作してみた話
simotin13
0
620
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
410
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.4k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
160
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
110
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
250
Featured
See All Featured
Ethics towards AI in product and experience design
skipperchong
2
310
Raft: Consensus for Rubyists
vanstee
141
7.5k
Navigating Team Friction
lara
192
16k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
220
Technical Leadership for Architectural Decision Making
baasie
3
420
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
600
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
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についてはアーキテクチャについつい目が行きがちであるが、それら はソフトウェアのドメインをいかに疎結合・高凝集にしていくための手段で ある • ドメインをどうモデリングしていくかの技法について、私たちはまだまだ学 ぶことがあるはず
まとめ