Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravelで同じ実装をドメイン駆動設計(DDD)とMVCで比較してみた(フロントはReact)
Search
take-t14
October 02, 2021
Programming
0
1.3k
Laravelで同じ実装をドメイン駆動設計(DDD)とMVCで比較してみた(フロントはReact)
take-t14
October 02, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
630
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
130
AI Agent Dojo #4: watsonx Orchestrate ADK体験
oniak3ibm
PRO
0
130
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
6
2.3k
SQL Server 2025 LT
odashinsuke
0
140
はじめてのカスタムエージェント【GitHub Copilot Agent Mode編】
satoshi256kbyte
0
160
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
210
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
650
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
230
CSC307 Lecture 03
javiergs
PRO
1
470
GoLab2025 Recap
kuro_kurorrr
0
3.6k
CSC307 Lecture 02
javiergs
PRO
1
760
Featured
See All Featured
Everyday Curiosity
cassininazir
0
120
Done Done
chrislema
186
16k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
250
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
37
Designing Experiences People Love
moore
143
24k
GitHub's CSS Performance
jonrohan
1032
470k
WCS-LA-2024
lcolladotor
0
410
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
Utilizing Notion as your number one productivity tool
mfonobong
2
200
The Limits of Empathy - UXLibs8
cassininazir
1
200
The Curse of the Amulet
leimatthew05
0
7.1k
Marketing to machines
jonoalderson
1
4.5k
Transcript
(フロントはReactで実装) 2021年11月24日 オブジェクト指向LT会 vol.3 畠山 忠修
氏名:畠山 忠修 属性:WEB系エンジニア 業務系、組み込み系、スマートフォンアプリ開発、 WEB系の開発経験あり C言語系の言語が好み
VB.NET、 C、C++、C#、Java、Kotlin、Swift、PHP、 JS(jQuery、AngularJS、Vue.js)等々の開発経験あ り バックエンド寄り。フロントエンド、インフラもやりま す。
【1】 • 検証内容と目的 【2】 • 実装するECサイトの機能 【3】 • 設計 【4】
• 自動テスト 【5】 • 検証結果発表 【6】 • まとめ 【7】 • おまけ
検証内容 同じ実装をMVCとドメイン駆動設計(以降DDD)で実 装 クリーンアーキテクチャ採用 DDD、軽量DDD、MVCの3パターンで検証
検証目的 DDDの見識を深める MVC、DDDを様々な観点で比較 検証結果を今後の開発に役立てる
機能 商品一覧 商品詳細 カート 注文
フロントエンド Reactを採用 Material UIでリッチなUIを実現 レスポンシブにも対応
クラス図 原則クリーンアーキテクチャと同じクラス構成に Laravelの都合で一部妥協
シーケンス図
集約 集約ルートから操作するよう実装
ドメインサービス カート追加は複数Entityを操作する ProductRepositoryからProduct Entity取得 CartItem Entity生成
CartItem EntityへProduct Entityをセット 上記一連の操作もドメイン知識と言える ユースケースではなく、ドメインサービスへ実装す るのが望ましいと判断 ドメイン貧血症に要注意
バリーデーションチェック Value Obujectのコンストラクタへバリデーション チェックを実装 Value Obujectをnewする度にtry catchするのは
冗長・・・ try catch無しでは複数入力エラーがあっても1つ ずつしか画面表示できない ModelFactoryというドメインサービスで解決
TDDで実装 ユースケース単位でUnitTestを実装 リファクタリングで効力発揮 リファクタリングでオールNG(レッド)に オールOK(グリーン)になるまで修正
画面が動くことを確認 TDDは品質担保に有用な事を立証
ファイル数・ステップ数 DDD>軽量DDD>MVC(予想通り) 種別 ファイル数 ステップ数 DDD 152 3,444
軽量DDD 102 2,298 MVC 23 725
パフォーマンス 7つの処理の平均値で比較 DDDは少し結果が悪いが、軽量DDD、MVCはほぼ同 等 DDDのデータ詰め替えコストで、大量データ取得時の み若干悪影響が出る模様(許容範囲内)
種別 速度(平均) 使用メモリ(平均) DDD 121ms 1437KB 軽量DDD 74ms 1199KB MVC 65ms 1096KB
メリット・デメリット 種別 メリット デメリット DDD ・疎結合・高凝集でメンテナンス性 が高い ・疎結合でUnitTestを実装しやす い
・ファイル数・ステップ数が多くなる ・データの詰め替えコストがかかる 軽量DDD ・DDDのメリットを継承 ・DDDと比べてファイル数・ステップ プ数は少ない ・DDDと比べてデータ詰め替えコス ストは低い ・ファイル数・ステップ数はMVCの3 3倍以上 ・データ詰め替えコストは0にはな らない MVC ・ファイル数・ステップ数が圧倒的 に少ない ・データ詰め替えコストがない ・蜜結合・低凝集でメンテナンス性 が低い ・UnitTestが実装しにくい ・重複コードが発生しやすい
DDDか軽量DDDなら、軽量DDDの方が良さそ う 1年未満の運用・低工数で実現したいWEBシ ステム → MVCが最適 1年以上の運用を想定したWEBシステム
→ 軽量DDDが最適
エヴァンス本とは 書籍「エリック・エヴァンスのドメイン駆動設計」 本検証をQiitaで公開中 https://qiita.com/take-t14/items/71398530e451dcd0c183 本検証のソースコードをGithubで公開中
PHP版・・・ https://github.com/take-t14/laravel-ddd-sample Ruby版・・・ https://github.com/take-t14/rails-react-sample