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

お手軽DomainModel

a.shimomura
June 10, 2024
69

 お手軽DomainModel

a.shimomura

June 10, 2024
Tweet

Transcript

  1. • akshimo(あくしも) ◦ X:@akshimo • 東京出身 ◦ 2021年〜新潟へ移住 ◦ 株式会社エクスライズ新潟支社長

    • アジャイル/スクラム • DDD/BDD/イベント駆動 • 好き:ウイスキー、物理学、哲学
  2. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 - レイヤードアーキテクチャ - イベント駆動 - BDD - CQRS - ADRパターン 利用している技術要素
  3. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 - レイヤードアーキテクチャ - Infrastructure - Domain - UseCase - Presentation レイヤードアーキテクチャ
  4. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 - Infrastructure - Eloquent - Domain - Entity,Specification,Event,ValueObject - UseCase - UseCase,Query,ReadModel - Presentation - Action, Respondor レイヤードアーキテクチャ
  5. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 - Infrastructure - Eloquent - Domain - Entity,Specification,Event,ValueObject - UseCase - UseCase,Query,ReadModel - Presentation - Action, Respondor 今日はここの話
  6. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 final class UserRepositoryEloquent implements UserRepositoryInterface { public function store(UserEnity $user); } 教科書通りのRepositoryパターン
  7. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 - ActiveRecord系ORMとRepositoryパターンの相性悪し - クラスが多くなり、複雑性も増す - 今どき実際にMySQLのコンテナ使ってテスト動かせるよね なかなかしんどい…
  8. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 ボブおじさん、 ぼく、もう疲れたよ…
  9. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 そもそも何が したいんだっけ?
  10. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 そもそも何が したいんだっけ? =>DomainModelを そのまま実装する
  11. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 final class UserEntity { private function __construct( private UserEloquent $eloquent ) { // 不変条件のチェックとか } } EloquentをEntityに内包させちゃう
  12. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 final class UserEntity { public static function build( string $email,... ): self {...} public static function reconstruct( UserEloquent $user ): self {...} } Factoryメソッド
  13. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 final class UserEntity { public function becomesPremium(): self { if ($this->age < 18) {throw …} $this->eloquent->plan = …; return new self($this->eloquent); } } ビジネスロジック
  14. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 final class UserEntity { public function persist(): self { $this->eloquent->save(); return new self($this->eloquent); } } 永続化
  15. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 Infrastructure Domain UseCase Presentation
  16. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 ボブおじさん 「DBは5年ごとに新しい技術が登場するぞ」
  17. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 - 確かに5年ごとに登場するはその通り - だが、5年ごとにプロダクトのDataSourceを刷新となる か? - RDBMSの寿命は長い - PHP/Laravelなら大体MySQL - https://zenn.dev/mpyw/articles/ce7d09eb6d811 7 新しいDataSourceが登場したら?
  18. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 Bad Good - どこに何が書いてあるか想像しやすい - 「こんなとこにこんなコードが! 」というサプライズがなくなった - 実装者から「この処理はどこに書けばいい? 」という迷いがなくなった - 開発速度が損なわれることなくスムーズに実装ができる - Domainの設計が無意識的に DB設計にひきずられる - これはそもそものモデリングのやり方のかの問題かも - 単一責任の原則やぶり気味
  19. 1 2 3 4 5 6 7 8 9 10

    11 12 13 14 - 無理せずLaravel(Eloquent)の恩恵をうける設計 を考えても良いかも - RDBへの依存は諦めちゃえ - もちろん、部分的にDIPの導入は考えるべき - ガッツリ頑張るならそもそも言語やFWから考え直した 方がいいかも… まとめ