SlideShare a Scribd company logo
Implementing
Domain-Driven Design
Part 1: Getting Started with DDD
神原 淳史
@atsukanrock
2015/08/07
今だから学びたい!DDD (Sansan .NET勉強会 #10)
自己紹介
• 神原 淳史 @atsukanrock
https://github.com/atsukanrock
• Sansan株式会社 (2014年11月から)
アバナード株式会社 (2011年7月~2014年10月)
• Software Developer
Domain-Driven Design / .NET / C# / Azure Cloud (´・ω・`)
今日のお題は…
Today’s Contents
DDD: Domain-Driven Design
IDDD: Implementing DDD
From DDD to IDDD
DDD published in 2004 IDDD published in 2013
コンセプトを提示 具体的な設計、Do / Don’tを提示
ベーシックでやや古いアーキテクチャ DDD発刊以降に出てきたアーキテクチャも導入
こいつの紹介
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
なぜDDDを採用するのか
Why do we employ DDD?
DDDならできます
できること 効果
Domain Expertsが持つ業務知識をモデル化 • 個々のDomain Expertに分散していた
ノウハウの共有
• 担当者が変わってもすぐに使える
開発生産性の向上 ※システムが複雑な場合に限る • 加速する事業環境の変化に素早く対応
Domain Expertsですら気付かなかった
新たな知見の発見
∵ (なぜならば)
モデル化することで:
• 「すぐに」「何度でも」シミュレーション可能
• 抽象化により本質が見える
• 単なる業務自動化でなくシステムが
事業を引っ張る
前提
• Domain Expertsはチームの一員となる
• Agile / Scrum
• Domain Expertsとチームは共通の言語 (Ubiquitous
Language) 、共通のモデルを使って会話する
• 「お客には設計の話なんてするな」ではない
とかゆってるけど
• Domain Expert is どこ
• チームの一員になってくれてモデルの話ができるひとって…
• DDDはCore Domain (事業差別化領域) に適用してこそ
最大の効果
• 「どの領域をシステム化するか」の選択権って…
DDDの本質の実践は困難…
それでも自社サービスなら…
• サービスの根幹部分がCore Domainになる
• Domain Expertsには自分たちがなる
• 外部アドバイザーとかは居るかもしれない
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
いつDDDを採用するのか
When to employ DDD
向き不向きがあります
複雑単純
長寿
短命
DDD
逃げる勇気
Access VBA
とか?
Transaction Script
/ Table Module
The DDD Scorecard from IDDD
• 一言で言うと:
DDDは複雑で長寿なシステムの
場合に使うべきもの
• CRUD中心のシステムなら
Scaffoldingとかで作れば良い
• あと、ゲームとか証券とか
にはたぶん向かない
向き不向きがあります
複雑単純
長寿
短命
DDD
逃げる勇気
Access VBA
とか?
Transaction Script
/ Table Module
実際のシステム
私見ですが
• システム全体がDDDの使用が適切な特性を持っている
わけではない (おそらくほぼ全てのシステムに言える)
マスタ管理とか、単純なのがあるはず
• DDDを採用するのは一部のCore Domainに絞って、
残りはScaffoldingとかTransaction Scriptで作れば良い
混ぜる勇気
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
IDDDの全体像
The whole picture of IDDD
ざっくり言うと
• 概論 (Why / When / How)
• Domainの分割、Bounded Context
• Architecture
• Domainモデリングの手法
• Bounded Contextの統合
• アプリケーション
今回は時間の都合上
• 概論 (Why / When / How)
• Domainの分割、Bounded Context
• Architecture
• Domainモデリングの手法
• Bounded Contextの統合
• アプリケーション
ここと (説明済み)
ここ (の一部) だけ
IDDDは盛り沢山なので…
残りは次回以降に!!
…だけどちょっとだけ
Domainの分割、Bounded Context
• システム化対象領域を
いかに分割するか
• (今流行りの) Microservice
にも通じる考え方
Architecture ※私の大好物
• Layers
• Dependency Inversion Principle
• Hexagonal / Ports and Adapters
• Service-Oriented / REST
• CQRS: Command-Query Responsibility Segregation
• Event Sourcing
and more…
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
DDDのモデリング手法
DDD style modeling technique
オブジェクトおよび概念
• Entity
• Value Object
• Service
• Domain Event
• Module
• Aggregate
• Factory
• Repository
New in IDDD
正しく知り、使うことで
• Domainの知識がモデルに集約される
• UI側に散ったりしない
• 不純物が混じらない
• トランザクション
• セキュリティ
• アプリケーション要件
• SOLID Principlesを守れる
• オブジェクト指向の超大事な原則5つ
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
Entity
The core of domain modeling
A Poor Entity
getter / setterのみのプロパティが並ぶ
(単なるデータの入れ物)
• SprintIdとStatusを合わせて設定すると
いう知識がクライアントに
• 実際にはValidationとかDB保存とか
もっとやることが多い
A DDD Style Entity
getter / setterのみのプロパティは
消えた
適切なValidation
Domainの知識
Entity in IDDD
• Identity大事
• 何をIdentityとするか
• Identityが満たすべき要件
• Entityの生成
• コンストラクター
• Factory
Entity in IDDD
• Validation
• Value Objectで守る
• プロパティのSetterで守る
• Validatorを切り出す
• DBに行くようなValidationはしない (例: ユニークチェック)
• Change Tracking
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
Value Object
To enrich your entities
もしValue Objectがなかったら
EntityにDomainの知識を持たせる。
間違ってはいないが…
プロパティがわらわらあって何かぼやけてる感じ
∵
ひとまとまりのコンセプトが他のコンテキストに
混じってしまっている
A sample Value Object
Domainの知識
Value Objectのある世界
ひとまとまりのコンセプトが
Value Objectにまとまった
Value Object in IDDD
• Identityを持つモノでなく、等価交換可能
• Immutable
• Value Equality (implements IEquatable<T>)
• Side-Effect-Free Behavior
• Persisting Value Objects
• DB等への保存
Value Object in IDDD
• Entity’s Identity as Value Object
• 単なるString等でなくXxxIdクラスを作る
• (↑とはいえ) 何でもかんでもValue Objectにはしない
• 複数の属性もしくは振る舞いを持つものだけ
• それ以外はプリミティブ型で済ます
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
少し複雑な例
(Application Service)
A little bit complex example of Application Service
A sample Application Service
DI前提 (changed from DDD)
Query Service ※後述
Application Service
• Domain Modelを使ってアプリケーション
のトランザクションを実行
• 必要なセキュリティを実装
Domain Model in Application Service
Entity
Repository
Value Object
Service
Query Service?
SQLベタ書き
Application Layer of Hexagonal Architecture ※後述
• CQRS (次回以降のお話) のQuery Command (参照のみ)
• データアクセスがRepositoryだけだとアプリケーション向け
のQueryがしんどい (Join とかあって)
EntityでなくData Transfer Objectを返す
Hexagonal Architecture?
• 一言で言うと:
Domain Modelさえ
クリーンに保てば、
後は作りやすいように
作ればおk
• DI (IoC) が前提になる
• 詳しくは次回以降に…
Table of Contents
• なぜDDDを採用するのか (3分)
• いつDDDを採用するのか (2分)
• IDDDの全体像 (5分)
• DDDのモデリング手法 (2分)
• Entity (5分)
• Value Object (資料のみ)
• 少し複雑な例 (Application Service) (5分)
• まとめ (3分)
まとめ
Wrap up
まとめ
• DDD採用の目的: システムの価値を上げる
• そのために、Domainモデリングの手法を学ぶ
• IDDDが具体的な指針を示した
捕捉
• 図、サンプルコードは全てIDDDから拝借した
https://github.com/VaughnVernon/IDDD_Samples_NET
• 実はDomain Modelをクリーンに保つには、それ以外の
ところ (例えばDBアクセス周り) に相当な工夫が必要
そのためDDDは、土台作りのための初期投資がかさんだり、
学習コストが高い問題があり、採用是非の見極めが重要
次回以降何が聞きたい?
1. Domainモデリング手法をもっと詳しく
2. Architecture
3. Domainの分割、Bounded Contextの統合
4. もう聞きたくない

More Related Content

What's hot (20)

PDF
私がドメイン駆動設計をやる理由
増田 亨
 
PDF
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
 
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
PPTX
GANMA!でDDDをやってみてから1年くらい経った
Yasuyuki Sugitani
 
PDF
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
貴志 上坂
 
PDF
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Takuya Kawabe
 
PDF
ドメイン駆動設計という仕事の流儀
増田 亨
 
PDF
リッチなドメインモデル 名前探し
増田 亨
 
PPT
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
PDF
ドメイン駆動設計 基本を理解する
増田 亨
 
PDF
ドメイン駆動設計とは何か 【入門編】
増田 亨
 
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
PDF
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
 
PDF
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
PPTX
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
sairoutine
 
PPTX
ドメイン駆動開発 勉強会 ①
Kakeru Kikuchi
 
PDF
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
 
PPTX
DDDモデリング勉強会 #6
株式会社Jurabi
 
PDF
DDD 20121106 SEA Forum November
増田 亨
 
PDF
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
 
私がドメイン駆動設計をやる理由
増田 亨
 
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
GANMA!でDDDをやってみてから1年くらい経った
Yasuyuki Sugitani
 
始めよう! ドメイン駆動設計&マイクロサービス開発 ~C# と Azure Service Fabric で最高の DDD 開発を~
貴志 上坂
 
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Takuya Kawabe
 
ドメイン駆動設計という仕事の流儀
増田 亨
 
リッチなドメインモデル 名前探し
増田 亨
 
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
ドメイン駆動設計 基本を理解する
増田 亨
 
ドメイン駆動設計とは何か 【入門編】
増田 亨
 
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
 
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
レガシーな Perl システムに DDD (ドメイン駆動設計)を取り入れる
sairoutine
 
ドメイン駆動開発 勉強会 ①
Kakeru Kikuchi
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
 
DDDモデリング勉強会 #6
株式会社Jurabi
 
DDD 20121106 SEA Forum November
増田 亨
 
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
 

Viewers also liked (20)

PPTX
C++のtemplate特殊化的なことをC#でやった話
Atsushi Kambara
 
PDF
Architecture driven development のすすめ
Atsushi Fukui
 
PPTX
Latest Status of Identity Federation
Atsushi Kambara
 
PDF
グローバル化はなぜ日時処理問題を引き起こすのか
Atsushi Kambara
 
PPTX
結果を出すチームビルディング術
Mao Ohnishi
 
PDF
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
Yoshimura Soichiro
 
PDF
Using ADO.NET Entity Framework in Domain Driven Design: A Pattern Approach
Hoan Phuc
 
PPTX
2014-08-30_aspnet-identity
kumake
 
PPTX
Entity Framework and Domain Driven Design
Julie Lerman
 
PPTX
Ms build 触ってみよう
Oda Shinsuke
 
PDF
Improving application design with a rich domain model (springone 2007)
Chris Richardson
 
PDF
「書く」ソフトウェア教育から「読む」ソフトウェア教育への転換 (in Japanese)
Toshihiko Yamakami
 
PPTX
Domain driven design
Mustafa Dağdelen
 
PPTX
ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話
chocolamint
 
PDF
FirefoxOSで学ぶJavaScript作法
cch-robo
 
PDF
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
Ryutaro Miyashita
 
PDF
ZTE OPEN を日本語化(バージョンアップ)してみる
cch-robo
 
PDF
Firebase Test Lab 無料枠を使ってみました。
cch-robo
 
PDF
Wearable realm
Ryutaro Miyashita
 
PDF
読むと怖くないDagger2
shinnosuke kugimiya
 
C++のtemplate特殊化的なことをC#でやった話
Atsushi Kambara
 
Architecture driven development のすすめ
Atsushi Fukui
 
Latest Status of Identity Federation
Atsushi Kambara
 
グローバル化はなぜ日時処理問題を引き起こすのか
Atsushi Kambara
 
結果を出すチームビルディング術
Mao Ohnishi
 
Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」
Yoshimura Soichiro
 
Using ADO.NET Entity Framework in Domain Driven Design: A Pattern Approach
Hoan Phuc
 
2014-08-30_aspnet-identity
kumake
 
Entity Framework and Domain Driven Design
Julie Lerman
 
Ms build 触ってみよう
Oda Shinsuke
 
Improving application design with a rich domain model (springone 2007)
Chris Richardson
 
「書く」ソフトウェア教育から「読む」ソフトウェア教育への転換 (in Japanese)
Toshihiko Yamakami
 
Domain driven design
Mustafa Dağdelen
 
ちょっとしたオレオレDSLも抽象構文木っぽくしておくと後からの拡張に対応しやすいよねっていうちょっとしたお話
chocolamint
 
FirefoxOSで学ぶJavaScript作法
cch-robo
 
Titanium 3.3 / 3.4 と iOS で気をつけたいこと
Ryutaro Miyashita
 
ZTE OPEN を日本語化(バージョンアップ)してみる
cch-robo
 
Firebase Test Lab 無料枠を使ってみました。
cch-robo
 
Wearable realm
Ryutaro Miyashita
 
読むと怖くないDagger2
shinnosuke kugimiya
 
Ad

Similar to Implementing Domain-Driven Design: Part 1 (20)

PPTX
20100324 勉強会資料(ドメイン駆動)
Masayuki Kanou
 
PDF
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
 
PPT
勉強会開催の案内
ReiObata
 
PDF
2022_sakura-yube_ddd.pdf
toshiki kawai
 
PPTX
NS study8 DDD Microservices Azuer Service Fabric
貴志 上坂
 
PDF
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
Fumiyasu Sumiya
 
PPTX
Relationship betweenddd and mvc
Takao Tetsuro
 
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
 
PPTX
福岡DDD勉強会vol.1
Yunosuke Taga
 
PDF
Dddをもっと身近に
Yukei Wachi
 
PDF
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
Tomoharu ASAMI
 
PDF
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
 
PDF
Frameworks We Live By: Design by day-to-day framework development: Multi-para...
Atsuhiro Kubo
 
PDF
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
Tomoharu ASAMI
 
PDF
DDD導入にどう立ち向かう? 開発現場への適用方あれこれ①
Yuichi Nadawaki
 
PDF
Android Architecture
shinnosuke kugimiya
 
PDF
Frameworks We Live By: Design by day-to-day framework development: Multi-para...
Atsuhiro Kubo
 
PDF
【19-B-5】出張!DDD難民救済キャンプ
kentaro watanabe
 
PDF
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Koichiro Matsuoka
 
PDF
ScalaMatsuri 2016
Yoshitaka Fujii
 
20100324 勉強会資料(ドメイン駆動)
Masayuki Kanou
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
Koichiro Matsuoka
 
勉強会開催の案内
ReiObata
 
2022_sakura-yube_ddd.pdf
toshiki kawai
 
NS study8 DDD Microservices Azuer Service Fabric
貴志 上坂
 
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
Fumiyasu Sumiya
 
Relationship betweenddd and mvc
Takao Tetsuro
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
Koichiro Matsuoka
 
福岡DDD勉強会vol.1
Yunosuke Taga
 
Dddをもっと身近に
Yukei Wachi
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
Tomoharu ASAMI
 
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
 
Frameworks We Live By: Design by day-to-day framework development: Multi-para...
Atsuhiro Kubo
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
Tomoharu ASAMI
 
DDD導入にどう立ち向かう? 開発現場への適用方あれこれ①
Yuichi Nadawaki
 
Android Architecture
shinnosuke kugimiya
 
Frameworks We Live By: Design by day-to-day framework development: Multi-para...
Atsuhiro Kubo
 
【19-B-5】出張!DDD難民救済キャンプ
kentaro watanabe
 
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Koichiro Matsuoka
 
ScalaMatsuri 2016
Yoshitaka Fujii
 
Ad

Recently uploaded (10)

PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 

Implementing Domain-Driven Design: Part 1