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
ADRという考えを取り入れてみて
Search
Infiniteloop
October 18, 2023
Programming
0
230
ADRという考えを取り入れてみて
【タガヤス その13】ILの日常業務から 発表資料
https://tagayas.connpass.com/event/145290/
Infiniteloop
October 18, 2023
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
16
55k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
520
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
1
740
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
1
1k
詫び石の裏側
infiniteloop_inc
0
750
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
33k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
230
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
170
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
150
Other Decks in Programming
See All in Programming
CIを整備してメンテナンスを生成AIに任せる
hazumirr
0
290
MySQL9でベクトルカラム登場!PHP×AWSでのAI/類似検索はこう変わる
suguruooki
1
250
Workers を定期実行する方法は一つじゃない
rokuosan
0
130
What's new in Adaptive Android development
fornewid
0
120
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
530
20250708_JAWS_opscdk
takuyay0ne
2
150
マッチングアプリにおけるフリックUIで苦労したこと
yuheiito
0
240
バイブスあるコーディングで ~PHP~ 便利ツールをつくるプラクティス
uzulla
1
290
Gemini CLIの"強み"を知る! Gemini CLIとClaude Codeを比較してみた!
kotahisafuru
2
190
状態遷移図を書こう / Sequence Chart vs State Diagram
orgachem
PRO
3
290
Git Sync を超える!OSS で実現する CDK Pull 型デプロイ / Deploying CDK with PipeCD in Pull-style
tkikuc
4
470
slogパッケージの深掘り
integral0515
0
160
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Building an army of robots
kneath
306
45k
How GitHub (no longer) Works
holman
314
140k
Scaling GitHub
holman
461
140k
How to train your dragon (web standard)
notwaldorf
96
6.1k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
Gamification - CAS2011
davidbonilla
81
5.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Done Done
chrislema
184
16k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
4 Signs Your Business is Dying
shpigford
184
22k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
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 終わり