Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ADRという考えを取り入れてみて
Search
Infiniteloop
October 18, 2023
Programming
330
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ADRという考えを取り入れてみて
【タガヤス その13】ILの日常業務から 発表資料
https://tagayas.connpass.com/event/145290/
Infiniteloop
October 18, 2023
More Decks by Infiniteloop
See All by Infiniteloop
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
18
90k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
750
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
1
1.2k
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
1
1.7k
詫び石の裏側
infiniteloop_inc
0
980
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
36k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
310
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
240
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
210
Other Decks in Programming
See All in Programming
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
190
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
120
SREの越境 / SRE Collaboration
y0hgi
0
130
「新人AI禁止のその先へ ― 参加と協働のステップアップ」Vibe TOKYO, AI & CRAFT / 2026年8月21日
kentarowada
0
100
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
170
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
スマート反転とウェブアクセシビリティ
camiha
0
210
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
130
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
110
Building an Out-of-Order CPU
latte72
1
780
Security issues being discussed on Web Platforms
petamoriken
0
940
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
200
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Technical Leadership for Architectural Decision Making
baasie
3
570
WCS-LA-2024
lcolladotor
0
830
We Are The Robots
honzajavorek
0
370
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
Side Projects
sachag
456
43k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
Being A Developer After 40
akosma
91
590k
Transcript
None
<date/time> <footer> 2 自己紹介
<date/time> <footer> 4 目次 • 話したいこと • なぜこの話を • ADRパターンとは
• MVCとの比較 • どんな成果につながったか • 纏め
<date/time> <footer> 5 話したいこと
<date/time> <footer> 6 ADRを意識して実装したことによってMとV の切り離しが上手くいき、修正がしやすく、 再利用性もあがった為開発効率が上がっ た
<date/time> <footer> 7 なぜこの話を
<date/time> <footer> 8 大きめの機能実装を担当した
<date/time> <footer> 9 MVCに綺麗に三分割されていない Controllerとテンプレートははっきり分かれている がそれ以外はModelのような構成
<date/time> <footer> 10 既存コードを丸々参考にすると部品分け は上手くいかなそう
<date/time> <footer> 11 しっかり機能分けしないと負の 遺産コードになってしまう
<date/time> <footer> 12 ソーシャルゲームの開発なので基本jsonを返す クライアント側とサーバーでこう来たらこう返すを定 義し その定義に沿ってレスポンスを構築する ↑これはMVCのVの役目
<date/time> <footer> 13 Client Server HTTPリクエスト HTTPレスポンス (type:json) 構築を行うのがViewの役目
<date/time> <footer> 14 参考にしようとしたコードはこれがMに含まれていた
<date/time> <footer> 15 ふむり、、どうしようか 浅ーい経験と知識の中に一つの光が そういえばADRパターンというのがあったな
<date/time> <footer> 16 ADRパターンとは
<date/time> <footer> 17 Paul M.Jonesさんが考案した MVC Refinementとして提唱されている、MVCの派 生のパターン
<date/time> <footer> 18 ADR • A=Action • D=Domain • R=Responder
Action Domain Responder
<date/time> <footer> 19 ADRのD(Domain) Dはビジネスロジック!!
<date/time> <footer> 20 ADRのR(Responder) Actionから受信したデータからHTTP応答を構築す るためのプレゼンテーションロジック
<date/time> <footer> 21 ADRのA(Action) 入力(リクエスト)に基づき DomainとResponderを制御する
<date/time> <footer> 22 Client Server HTTPリクエスト Actionが入力を収集 ・ドメインを呼び出し ・結果を保持 ・HTTP応答を作成
ActionがHTTP応答 受信 1.HTTPリクエストから入力を収集(Action) 2.これらの入力でドメインを呼び出し(Action) 3.結果を保持(Domain) 4.HTTP応答を作成(Responder) 5.HTTP応答(Controller) 処理の流れ
<date/time> <footer> 23 MVCに似たアーキテクチャで 分かりやすい
<date/time> <footer> 24 MVCパターンとの比較
<date/time> <footer> 25 そもそもとしてなのですが、新卒でこの会社に入っ てからずっと今のプロジェクトなので、MVCでPHP のフレームワーク使って書く例はそんなには知らな い!!
<date/time> <footer> 26 そもそもADRはMVCの派生パターン Action = Controller Domain = Model
Responder = View
<date/time> <footer> 27 差ほど違いがないので省略 ActionとController DomainとView
<date/time> <footer> 28 違いはResponderとViewにあ る
<date/time> <footer> 29 そもそもViewの役割って?
<date/time> <footer> 30 処理結果をユーザーにどの形 で見せるかを決める
<date/time> <footer> 31 Viewは ControllerでHTTPレスポンスのbodyを生成し、 HTTPヘッダの値もControllerの中で設定されま す。Viewと聞くと、ああテンプレートのことね、とい う人も多いでしょう。
<date/time> <footer> 32 それに対してResponder
<date/time> <footer> 33 Domainが出力したデータを HTTPの表現に変換する
<date/time> <footer> 34 結局の所MVCとADRって差ほ ど変わらないのでは?
<date/time> <footer> 35 大きな違いは無いがADRは MVCの上位互換
<date/time> <footer> 36 一般的に使われているMVCを 基本使うで良いがADRの考え 方を少し取り入れるだけでも 良いと思う
<date/time> <footer> 37 どんな成果に繋がったか
<date/time> <footer> 38 責務の切り分けが上手くできて分かりや すく機能の使いまわしがしやすいコード になった
<date/time> <footer> 39 コード比較
<date/time> <footer> 40 Before
<date/time> <footer> 41 class ItemController { public function getItem(int
$item_id, ItemService $service): JsonResponse { $user = Auth::user; // ユーザーIDとアイテムIDから該当のアイテムを取得 $item = $service->getItem($user->id, $item_id); // アイテムが存在しなかった場合404を返す if (is_null($item)) { response()->json([ 'status' => 404, 'errors' => $this->getMessage(アイテムが存在しない) ], 404); } // HTTPレスポンス構築 return response()->json($item, 200); } }
<date/time> <footer> 42 class ItemController { public function getItem(int
$item_id, ItemService $service): JsonResponse { $user = Auth::user; // ユーザーIDとアイテムIDから該当のアイテムを取得 // レスポンスも構築 $response = $service->getItem($user->id, $item_id); return $response; } }
<date/time> <footer> 43 class ItemService { public function getItem(int
$item_id): JsonResponse { // ユーザーIDとアイテムIDから該当のアイテムを取得 $item = $service->getItem($user->id, $item_id); // アイテムが存在しなかった場合404を返す if (is_null($item)) { response()->json([ 'status' => 404, 'errors' => $this->getMessage(アイテムが存在しない) ], 404); } // HTTPレスポンス構築 return response()->json($item, 200); } }
<date/time> <footer> 44 After
<date/time> <footer> 45 class ItemAcquisitionAction { private $service; private $responder;
public function __construct(ItemService $service, ItemResponder $item_responder) { $this->service = $service; $this->responder = $item_responder; } public function __invoke(int $item_id): JsonResponse { $user = Auth::user; // ユーザーIDとアイテムIDから該当のアイテムを取得 $item = $service->getItem($user->id, $item_id); // HTTPレスポンス構築 return $this->responder->execute($item); } }
<date/time> <footer> 46 class ItemResponder { public function execute(?Item item):
JsonResponse { // アイテムが存在しなかった場合404を返す if (is_null($item)) { response()->json([ 'status' => 404, 'errors' => $this->getMessage(アイテムが存在しない) ], 404); } // HTTPレスポンス構築 return response()->json($item, 200); } }
<date/time> <footer> 47 纏め
<date/time> <footer> 48 今携わっているプロジェクトは規模が大 きくADRをそのまま取り入れるのは無理 でしたが、考え方を取り入れたことによっ て取り入れる前よりも良いコードが書け たのではないかと思います
<date/time> <footer> 49 参考URL ・Paul M.Jones https://github.com/pmjones/adr ・ADRパターン実践時のトレードオフとの向き合い方 https://nextat.co.jp/staff/archives/174 ・[RadarPHP]Action-Domain-Responder(ADR)パターンとRadarの紹介
https://nextat.co.jp/staff/archives/149
<date/time> <footer> 50 終わり