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.2k
Laravelで同じ実装をドメイン駆動設計(DDD)とMVCで比較してみた(フロントはReact)
take-t14
October 02, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
200
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
120
Vue・React マルチプロダクト開発を支える Vite
andpad
0
110
Honoアップデート 2025年夏
yusukebe
1
880
testingを眺める
matumoto
1
130
Laravel Boost 超入門
fire_arlo
2
160
JSONataを使ってみよう Step Functionsが楽しくなる実践テクニック #devio2025
dafujii
0
180
AIコーディングAgentとの向き合い方
eycjur
0
250
Ruby Parser progress report 2025
yui_knk
1
240
[FEConf 2025] 모노레포 절망편, 14개 레포로 부활하기까지 걸린 1년
mmmaxkim
0
1.4k
物語を動かす行動"量" #エンジニアニメ
konifar
14
5.7k
自作OSでDOOMを動かしてみた
zakki0925224
1
1.4k
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
A better future with KSS
kneath
239
17k
Six Lessons from altMBA
skipperchong
28
4k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
Designing for humans not robots
tammielis
253
25k
Documentation Writing (for coders)
carmenintech
73
5k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
The Invisible Side of Design
smashingmag
301
51k
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