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
GitHub Copilotを使いこなせ!/mastering_github_copilot!
kotakageyama
1
220
Blazing Fast UI Development with Compose Hot Reload (droidcon London 2025)
zsmb
0
430
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
4
17k
Ktorで簡単AIアプリケーション
tsukakei
0
120
AI Agent 時代的開發者生存指南
eddie
4
2.2k
ビルドプロセスをデバッグしよう!
yt8492
0
170
外接に惑わされない自システムの処理時間SLIをOpenTelemetryで実現した話
kotaro7750
0
130
なんでRustの環境構築してないのにRust製のツールが動くの? / Why Do Rust-Based Tools Run Without a Rust Environment?
ssssota
14
47k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
440
実践Claude Code:20の失敗から学ぶAIペアプログラミング
takedatakashi
18
9.2k
NIKKEI Tech Talk#38
cipepser
0
340
Google Opalで使える37のライブラリ
mickey_kubo
3
170
Featured
See All Featured
Writing Fast Ruby
sferik
630
62k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Building an army of robots
kneath
306
46k
How to train your dragon (web standard)
notwaldorf
97
6.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
940
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.7k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Side Projects
sachag
455
43k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
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