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
TypeScriptでDXを上げろ! Hono編
yusukebe
3
870
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
40
15k
構造化・自動化・ガードレール - Vibe Coding実践記 -
tonegawa07
0
150
[DevinMeetupTokyo2025] コード書かせないDevinの使い方
takumiyoshikawa
2
210
リッチエディターを安全に開発・運用するために
unachang113
1
270
PHPUnitの限界をPlaywrightで補完するテストアプローチ
yuzneri
0
340
20250708_JAWS_opscdk
takuyay0ne
2
150
CIを整備してメンテナンスを生成AIに任せる
hazumirr
0
290
Streamlitで実現できるようになったこと、実現してくれたこと
ayumu_yamaguchi
2
230
テストから始めるAgentic Coding 〜Claude Codeと共に行うTDD〜 / Agentic Coding starts with testing
rkaga
17
6.1k
可変性を制する設計: 構造と振る舞いから考える概念モデリングとその実装
a_suenami
7
1k
ご注文の差分はこちらですか? 〜 AWS CDK のいろいろな差分検出と安全なデプロイ
konokenj
4
710
Featured
See All Featured
Speed Design
sergeychernyshev
32
1k
Embracing the Ebb and Flow
colly
86
4.8k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
760
Raft: Consensus for Rubyists
vanstee
140
7k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
54k
Rails Girls Zürich Keynote
gr2m
95
14k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
Practical Orchestrator
shlominoach
189
11k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.4k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
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 終わり