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
1.3k
0
Share
Laravelで同じ実装をドメイン駆動設計(DDD)とMVCで比較してみた(フロントはReact)
take-t14
October 02, 2021
Other Decks in Programming
See All in Programming
「速くなった気がする」をデータで疑う
senleaf24
0
110
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
180
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.7k
飯MCP
yusukebe
0
440
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
290
How to stabilize UI tests using XCTest
akkeylab
0
150
Coding as Prompting Since 2025
ragingwind
0
570
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.5k
安いハードウェアでVulkan
fadis
1
850
テレメトリーシグナルが導くパフォーマンス最適化 / Performance Optimization Driven by Telemetry Signals
seike460
PRO
2
200
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
150
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
1.2k
Featured
See All Featured
Building Applications with DynamoDB
mza
96
7k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
91
Into the Great Unknown - MozCon
thekraken
40
2.3k
Everyday Curiosity
cassininazir
0
180
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
230
The SEO Collaboration Effect
kristinabergwall1
0
410
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
700
RailsConf 2023
tenderlove
30
1.4k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
170
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
490
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
340
Believing is Seeing
oripsolob
1
100
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