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
55
ADRという考えを取り入れてみて
【タガヤス その13】ILの日常業務から 発表資料
https://tagayas.connpass.com/event/145290/
Infiniteloop
October 18, 2023
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
詫び石の裏側
infiniteloop_inc
0
94
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
5
18k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
59
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
70
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
39
アニメーションとスキニングをBurstで独自実装する
infiniteloop_inc
0
100
VRChatでお酒が注げる飲み物アセットの紹介
infiniteloop_inc
0
88
3Dプリンタって いいね
infiniteloop_inc
0
29
社内ソフトスキルを考える
infiniteloop_inc
0
56
Other Decks in Programming
See All in Programming
Amazon SQSコンシューマー疎結合への旅 - 出張! #DevelopersIO IT技術ブログの中の人が語る勉強会 #3
quiver
0
330
Exploring the Implementation of “t.Run”, “t.Parallel”, and “t.Cleanup”
akarin
1
130
冗長なエラーログを削減し、スタックトレースを手に入れる / Reducing Verbose Error Logs and Obtaining Stack Traces
upamune
0
1.1k
使ってみよう Azure AI Document Intelligence
kosmosebi
2
360
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
1
370
Going beyond Apache Parquet's default settings
xhochy
0
130
PHPはいつから死んでいるかの調査
chiroruxx
2
420
初心者のためのRubyKaigi入門/RubyKaigi Introduction
a_matsuda
10
1.5k
Webアプリをできるだけコードを手書きしないで作ってみる
tomokusaba
2
170
Deep Dive into React Stream/Serialize
mugi_uno
3
700
見た目から始める生産性向上
ikumatadokoro
10
1.4k
Ruby Pattern Matching
bkuhlmann
0
930
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
176
21k
The Language of Interfaces
destraynor
151
23k
The Art of Programming - Codeland 2020
erikaheidi
43
12k
Agile that works and the tools we love
rasmusluckow
325
20k
Creatively Recalculating Your Daily Design Routine
revolveconf
211
11k
A designer walks into a library…
pauljervisheath
201
23k
RailsConf 2023
tenderlove
9
560
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
15
1.6k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
12
1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
221
21k
How to Ace a Technical Interview
jacobian
273
22k
The Brand Is Dead. Long Live the Brand.
mthomps
49
29k
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 終わり