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
Porting a visionOS App to Android XR
akkeylab
0
470
ニーリーにおけるプロダクトエンジニア
nealle
0
840
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
1
270
チームのテスト力を総合的に鍛えて品質、スピード、レジリエンスを共立させる/Testing approach that improves quality, speed, and resilience
goyoki
5
890
PipeCDのプラグイン化で目指すところ
warashi
1
280
iOS 26にアップデートすると実機でのHot Reloadができない?
umigishiaoi
0
130
「テストは愚直&&網羅的に書くほどよい」という誤解 / Test Smarter, Not Harder
munetoshi
0
170
テストから始めるAgentic Coding 〜Claude Codeと共に行うTDD〜 / Agentic Coding starts with testing
rkaga
13
4.6k
LT 2025-06-30: プロダクトエンジニアの役割
yamamotok
0
760
チームで開発し事業を加速するための"良い"設計の考え方 @ サポーターズCoLab 2025-07-08
agatan
1
430
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
770
ペアプロ × 生成AI 現場での実践と課題について / generative-ai-in-pair-programming
codmoninc
2
18k
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
Speed Design
sergeychernyshev
32
1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Site-Speed That Sticks
csswizardry
10
690
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
690
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.6k
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
Making Projects Easy
brettharned
116
6.3k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
820
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
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