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
240
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
57k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
530
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
1
750
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
1
1k
詫び石の裏側
infiniteloop_inc
0
760
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
34k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
230
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
180
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
150
Other Decks in Programming
See All in Programming
STUNMESH-go: Wireguard NAT穿隧工具的源起與介紹
tjjh89017
0
380
なぜ今、Terraformの本を書いたのか? - 著者陣に聞く!『Terraformではじめる実践IaC』登壇資料
fufuhu
4
620
実践 Dev Containers × Claude Code
touyu
1
210
AI時代のドメイン駆動設計-DDD実践におけるAI活用のあり方 / ddd-in-ai-era
minodriven
21
7.9k
それ CLI フレームワークがなくてもできるよ / Building CLI Tools Without Frameworks
orgachem
PRO
17
3.9k
パスタの技術
yusukebe
1
390
レガシープロジェクトで最大限AIの恩恵を受けられるようClaude Codeを利用する
tk1351
2
150
マイコンでもRustのtestがしたい その2/KernelVM Tokyo 18
tnishinaga
2
2.3k
GUI操作LLMの最新動向: UI-TARSと関連論文紹介
kfujikawa
0
970
AHC051解法紹介
eijirou
0
590
ライブ配信サービスの インフラのジレンマ -マルチクラウドに至ったワケ-
mirrativ
1
230
Webinar: AI-Powered Development: Transformiere deinen Workflow mit Coding Tools und MCP Servern
danielsogl
0
130
Featured
See All Featured
It's Worth the Effort
3n
186
28k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
770
Statistics for Hackers
jakevdp
799
220k
Art, The Web, and Tiny UX
lynnandtonic
301
21k
Code Review Best Practice
trishagee
69
19k
Unsuck your backbone
ammeep
671
58k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Site-Speed That Sticks
csswizardry
10
770
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Writing Fast Ruby
sferik
628
62k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
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 終わり