<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
終わり

ADRという考えを取り入れてみて