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

[モダンアプリ勉強会] DDDのことはじめ

Avatar for 坂本 勇人 坂本 勇人
September 06, 2026
110

[モダンアプリ勉強会] DDDのことはじめ

Avatar for 坂本 勇人

坂本 勇人

September 06, 2026

Transcript

  1. ⾃⼰紹介 • 名前 • • • 坂本 勇⼈(Sakamoto Yuto) 所属

    • クラウド事業統括本部 • モダンアプリコンサルティングチーム 普段のお仕事 • お客さんのスクラムに参加して要件定義から開発までのお⼿伝いをしてます • 実装するのが好きですが、アーキ考えてるのも好き
  2. ⽬次 1. オープニング 2. ドメインとは / DDD とは 3. メリット

    → 本当に守れる?(⼊⼝‧永続化‧Repository) 4. いつ DDD する? 5. 構成要素(Entity → Value Object → Aggregate) 6. 集約の切り⽅ 7. クロージング
  3. 不変条件:さっきのコードで本当に守れる? → このままでは守れない addBook() を書いただけでは 不⼗分 本と本棚を 別々に 操作 できると、

    そのルールを守る処理が コード上で必ず通る形になっていない (どこかでチェックしても、別の更新経路ですり抜けうる)
  4. 更新可能なまとまりを制限する • Book / Bookshelf を 別々に 更新できる → addBook()

    をすり抜けたBookができてしまう • Bookshelfしか更新できない → Bookを追加するためには addBook() しなければいけない Bookshelfの形でしか更新できなくすることでルールを守らせる → 整合が保証されたまとまり= 集約
  5. いつ DDD を検討するか 2つの段階に分けて考える 考え方 実装 内容 概念構造として捉える Entity /

    集約 / Repository まで整える 度合い 常に 役に立つ 規模・難易度 次第
  6. いつ DDD を検討するか 本棚の例は、向いている寄り 観点 向いている 過剰になりやすい ルール 複雑なルールがある (本棚の容量など)

    入力チェック程度で足りる 更新 入口が複数ある CRUD 1本で問題ない 知識 仕様が 属人化 している CRUDで回せる程度 寿命 長く運用 する 使い捨て
  7. Entity の特性 • 同⼀性(ID) で区別される ◦ • 属性を持つ ◦ •

    IDが同じであれば同⼀のオブジェクト プリミティブな値(例: title: string)、またはValueObject 状態が変わる(Mutable)
  8. Value Object の特性 • 値の等価性で⽐較(ID による同⼀性はない) • プリミティブな値を 1つ以上 内包し意味とルールを閉じ込める

    ◦ • 複数の値間で整合をとる必要がある場合2つ以上の値を所有する 値が変わらない(Immutable) ◦ Value Objectに内包されている値は直接書き換えない ◦ Entityの所有するValue Objectに変更を加えたい場合、新しいValue Objectと差し替え る
  9. 集約(Aggregate)の特性 • 1つの集約につき、集約ルートととなるEntityが必ず1つ存在する • 外部からの⼦の操作は必ず 集約ルートを経由する ◦ • Bookshelfの books

    は addBook/removeBook で操作する ⼦となるEntityが存在しないEntityは、そのEntityをルートとする単独の 集約と⾔える ◦ 単独で整合が保証されており読み書きが可能である
  10. 集約の切り⽅ 判断基準: 常に⼀緒に整合性を保つべき不変条件があるか 親⼦関係がある ≠ 必ず 1 集約 パターン 例

    同一集約内 本棚 + 本 + 容量 分ける 組織とメンバー (跨いだ不変条件がない)
  11. 本⽇のまとめ 1. DDD = ドメインの概念構造をコードに反映する 2. 守りたいルールは 「必ず通る道」 で守る →

    集約 + Repository 3. メリット = バイパスしにくい / 読みやすい / 変更に強い 4. 考え⽅は常に有⽤、実装は複雑なところから 5. 構成要素 = Entity / Value Object / Aggregate 集約は迷ったら 不変条件 で切る