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

趣味ではじめる ドメイン駆動設計+クリーンアーキテクチャ

趣味ではじめる ドメイン駆動設計+クリーンアーキテクチャ

23卒エンジニア志望学生LT会 vol.2 登壇資料
https://connpass.com/event/215902/

AokabiC

July 17, 2021
Tweet

Other Decks in Programming

Transcript

  1. 誰 • 碧黴(あおかび) • 東北大学大学院 情報科学研究科 M1 • 前世では競プロをやっていた •

    最近はWeb Frontend (React) / Backend (Go, Python) • 絵を描く • GitHubとか: @AokabiC • Portfolio: team-seadrive.com 2
  2. Agenda • 「ドメイン駆動設計」って? • ドメインモデルとは • Clean Architecture 各層ごとの役割に分けて説明 •

    簡単なオブジェクト指向の知識を前提とします • コードはGolangですが、特有の知識は要求しません 3 by Renée French
  3. 「ドメイン駆動設計」って? • 「ドメイン」の知識を中心とした設計 • #とは • 難しそう? そうでもない • オブジェクト指向を最大限に生かすような設計

    • 単一責任(責務の分離)、変更箇所は最小限 • 品質を担保しやすい • 「作って終わり」になりがちな趣味プロダクトを運用に導くヒント 4
  4. ドメインとは • ソフトウェアが組み立てられる「世界」を記述したもの • 必要に応じて知識の取捨選択がされる • 現実世界でのトラック … エンジン動力で車輪が回転し走る •

    輸送管理システムでのトラック … 荷物が一定量載る輸送手段でしかない • 現実 (or 仮想) の営みを必要十分に抽象化したもの(ドメインモデル) 物流拠点 輸送手段 輸送先 5
  5. Twitter で考えてみる 1:Many name username description Tweet User profile image

    birth date text media created at ~ Twitter World ~ 7
  6. Twitter で考えてみる 1:Many name username description Tweet User profile image

    birth date text media created at ~ Twitter World ~ User 8 フォロー いいね リプライ …
  7. Twitter で考えてみる • 概念、ルールがモデルとしてカプセル化されている(ドメインモデル) name username description User profile image

    birth date - 13歳未満はNG - 正方形の jpeg / gif / png 画像 - … - 4~16文字の[a-zA-Z0-9_], 重複してはならない - … 9
  8. User や Tweet は? • や は Value Object とは異なる性質がある

    • ライフサイクルがある • User は生まれ、いつかは死んでいく • 等価性で比較されない • 姓名(=Userの属性)が同じでも、別人のはず • 識別子(ID)が要る → 同一性による比較 • 可変 • これらは Entity と呼ばれる User Tweet 12
  9. ドメイン層の責務 • Value Object や Entity を駆使して、 ソフトウェアが組み立てられる「世界」のルールを記述できる!* …しかし、これだけではルールを記述したのみ •

    ソフトウェアとして使うためには それらを組み合わせて 機能を作らなければならない (ユースケース) * 実際にはこの他にも、Domain Service (VOやEntityの振る舞いとするには不自然なもの。Userの存在判定など) や Factory (複雑なEntityの生成方法を担う)などがドメイン層にある。今回は割愛。 14
  10. ユースケース 1:Many name username description profile image birth date text

    media created at User Tweet User フォロー いいね リプライ … ~ Twitter World ~ 15
  11. アダプター層 • 役割は「変換器」 • Request, id が 不正な値なら弾く ( GET

    users/:id ) • ドメインでの処理結果を JSONに変換して返却 22
  12. アダプター層 • 役割は「変換器」 • Request, id が 不正な値なら弾く ( GET

    users/:id ) • ドメインでの処理結果を JSONに変換して返却 → ユースケースを APIとして提供できた! 23
  13. プター/インフラに置く ry による依存関係逆転 Clean Architecture User フォロー いいね リプライ …

    変換 インフラ アダプ ター ユース ケース ドメイン モデル 抽象 具象 I/F 大事なのは ドメインと 実装詳細(具象)を 分けること 29
  14. • 「作って終わり」になりがちな趣味プロダクトを運用に導くヒント 「ドメイン駆動設計」 → ドメイン中心で 思考 と コード を一致させる! →

    高いテスタビリティと品質を担保する • コード量はMVCフレームワークに乗っかった場合と比べ増加する → とりあえず動かしたい場合は向かない (そもそも趣味プロダクトを完成まで持っていくのは難しい) まとめ 32
  15. 参考: - 成瀬 允宣 『ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本』 - The Clean

    Architecture(翻訳) (https://blog.tai2.net/the_clean_architecture.html) - 【プログラミング】実践クリーンアーキテクチャ – YouTube (https://www.youtube.com/watch?v=BvzjpAe3d4g) - クリーンアーキテクチャ完全に理解した (https://gist.github.com/mpppk/609d592f25cab9312654b39f1b357c60) スライド内での実装(Golang): https://github.com/AokabiC/clean-like-api Appendix 34