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

Implementing Domain-Driven Design: Part 1

Implementing Domain-Driven Design: Part 1

2015年8月に私が公開したスライドです。長らくSlideShareに配置していましたが、SlideShareが広告まみれになって酷いので、Speaker Deckに移しました。以下、公開時の紹介文です。

---

2013 年に出版された "Implementing Domain-Driven Design" の内容を解説します。第 1 回の今回は、大上段の「なぜ?」「いつ?」から初めて、DDD のイメージをつかむためのサンプルコードを見ていきます。

Atsushi Kambara

August 07, 2015
Tweet

More Decks by Atsushi Kambara

Other Decks in Programming

Transcript

  1. Implementing Domain-Driven Design Part 1: Getting Started with DDD 神原

    淳史 @atsukanrock 2015/08/07 今だから学びたい!DDD (Sansan .NET勉強会 #10)
  2. 自己紹介 • 神原 淳史 @atsukanrock https://github.com/atsukanrock • Sansan株式会社 (2014年11月から) アバナード株式会社

    (2011年7月~2014年10月) • Software Developer Domain-Driven Design / .NET / C# / Azure Cloud (´・ω・`)
  3. From DDD to IDDD DDD published in 2004 IDDD published

    in 2013 コンセプトを提示 具体的な設計、Do / Don’tを提示 ベーシックでやや古いアーキテクチャ DDD発刊以降に出てきたアーキテクチャも導入 こいつの紹介
  4. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)
  5. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)
  6. DDDならできます できること 効果 Domain Expertsが持つ業務知識をモデル化 • 個々のDomain Expertに分散していた ノウハウの共有 •

    担当者が変わってもすぐに使える 開発生産性の向上 ※システムが複雑な場合に限る • 加速する事業環境の変化に素早く対応 Domain Expertsですら気付かなかった 新たな知見の発見 ∵ (なぜならば) モデル化することで: • 「すぐに」「何度でも」シミュレーション可能 • 抽象化により本質が見える • 単なる業務自動化でなくシステムが 事業を引っ張る
  7. 前提 • Domain Expertsはチームの一員となる • Agile / Scrum • Domain

    Expertsとチームは共通の言語 (Ubiquitous Language) 、共通のモデルを使って会話する • 「お客には設計の話なんてするな」ではない
  8. とかゆってるけど • Domain Expert is どこ • チームの一員になってくれてモデルの話ができるひとって… • DDDはCore

    Domain (事業差別化領域) に適用してこそ 最大の効果 • 「どの領域をシステム化するか」の選択権って…
  9. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)
  10. The DDD Scorecard from IDDD • 一言で言うと: DDDは複雑で長寿なシステムの 場合に使うべきもの •

    CRUD中心のシステムなら Scaffoldingとかで作れば良い • あと、ゲームとか証券とか にはたぶん向かない
  11. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)
  12. ざっくり言うと • 概論 (Why / When / How) • Domainの分割、Bounded

    Context • Architecture • Domainモデリングの手法 • Bounded Contextの統合 • アプリケーション
  13. 今回は時間の都合上 • 概論 (Why / When / How) • Domainの分割、Bounded

    Context • Architecture • Domainモデリングの手法 • Bounded Contextの統合 • アプリケーション ここと (説明済み) ここ (の一部) だけ
  14. Architecture ※私の大好物 • Layers • Dependency Inversion Principle • Hexagonal

    / Ports and Adapters • Service-Oriented / REST • CQRS: Command-Query Responsibility Segregation • Event Sourcing and more…
  15. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)
  16. オブジェクトおよび概念 • Entity • Value Object • Service • Domain

    Event • Module • Aggregate • Factory • Repository New in IDDD
  17. 正しく知り、使うことで • Domainの知識がモデルに集約される • UI側に散ったりしない • 不純物が混じらない • トランザクション •

    セキュリティ • アプリケーション要件 • SOLID Principlesを守れる • オブジェクト指向の超大事な原則5つ
  18. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)
  19. Entity in IDDD • Validation • Value Objectで守る • プロパティのSetterで守る

    • Validatorを切り出す • DBに行くようなValidationはしない (例: ユニークチェック) • Change Tracking
  20. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)
  21. Value Object in IDDD • Identityを持つモノでなく、等価交換可能 • Immutable • Value

    Equality (implements IEquatable<T>) • Side-Effect-Free Behavior • Persisting Value Objects • DB等への保存
  22. Value Object in IDDD • Entity’s Identity as Value Object

    • 単なるString等でなくXxxIdクラスを作る • (↑とはいえ) 何でもかんでもValue Objectにはしない • 複数の属性もしくは振る舞いを持つものだけ • それ以外はプリミティブ型で済ます
  23. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)
  24. A sample Application Service DI前提 (changed from DDD) Query Service

    ※後述 Application Service • Domain Modelを使ってアプリケーション のトランザクションを実行 • 必要なセキュリティを実装
  25. Query Service? SQLベタ書き Application Layer of Hexagonal Architecture ※後述 •

    CQRS (次回以降のお話) のQuery Command (参照のみ) • データアクセスがRepositoryだけだとアプリケーション向け のQueryがしんどい (Join とかあって) EntityでなくData Transfer Objectを返す
  26. Table of Contents • なぜDDDを採用するのか (3分) • いつDDDを採用するのか (2分) •

    IDDDの全体像 (5分) • DDDのモデリング手法 (2分) • Entity (5分) • Value Object (資料のみ) • 少し複雑な例 (Application Service) (5分) • まとめ (3分)