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

DDDを志して3年経ったら「DDDの皮を被ったクリーンアーキテクチャ」になった話【デブサミ20...

meijin
July 23, 2024

 DDDを志して3年経ったら「DDDの皮を被ったクリーンアーキテクチャ」になった話【デブサミ2024夏】

こちらの講演で発表した資料です。

https://event.shoeisha.jp/devsumi/20240723/session/5097

meijin

July 23, 2024
Tweet

More Decks by meijin

Other Decks in Programming

Transcript

  1. ①機能群ごとにディレクトリ DDDの境界づけられたコンテキストやフロントエンドのPackage by Featureに近い それぞれの機能群で互いに参照したいケースは、ひねらずに愚直に実装 ※実践DDDなどを読んでいると、コンテキストを跨ぐときの設計手法もいろいろあるようだ が、ビジネス的に境界をまたぐことが少ないこと、全エンジニアが全機能を開発するフェー ズであることなどから、シンプルに参照してもスパゲティになりにくいと判断 ├── src/app/Domain

    │ ├── Calendar # 授業予定管理機能なのでDDDに寄せる │ ├── ChatRoom # ただのチャットなのでシンプルに │ ├── Learning # 宿題などの学習記録管理なのでDDDに寄せる │ ├── Notification # 通知機能なのでシンプルに │ ├── OnlineTeaching # オンライン授業機能なのでDDDに寄せる │ ├── TeacherSearch # 先生検索機能なのでシンプルに ...
  2. Queryの例 先生が見るカレンダーに表示されるデータ用のクエリ。授業予定もプライベートな予定も両方表示できる 数少ない画面なので専用のQueryを用意。Query実装時は必ず唯一のpublicメソッド handle を持つこと で多目的に使われないようにする。 class MySQLGetCalendarQuery implements GetCalendarQueryInterface

    { public function __construct( private HogeQueryInterface $hogeQuery, private FugaQueryInterface $fugaQuery ) {} /** * 中略 */ public function handle(int $teacherId, Carbon $startAt, Carbon $endAt): array { $lessonSchedules = $this->hogeQuery->handle($teacherId, $startAt, $endAt); $hogeSchedules = $this->fugaQuery>handle($teacherId, $startAt, $endAt); return [...$lessonSchedules, ...$hogeSchedules]; } }