Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

2 自己紹介

Slide 3

Slide 3 text

4 目次 ● 話したいこと
 ● なぜこの話を
 ● ADRパターンとは ● MVCとの比較 ● どんな成果につながったか ● 纏め

Slide 4

Slide 4 text

5 話したいこと

Slide 5

Slide 5 text

6 ADRを意識して実装したことによってMとV の切り離しが上手くいき、修正がしやすく、 再利用性もあがった為開発効率が上がっ た

Slide 6

Slide 6 text

7 なぜこの話を

Slide 7

Slide 7 text

8 大きめの機能実装を担当した

Slide 8

Slide 8 text

9 MVCに綺麗に三分割されていない 
 Controllerとテンプレートははっきり分かれている がそれ以外はModelのような構成


Slide 9

Slide 9 text

10 既存コードを丸々参考にすると部品分け は上手くいかなそう

Slide 10

Slide 10 text

11 しっかり機能分けしないと負の 遺産コードになってしまう

Slide 11

Slide 11 text

12 ソーシャルゲームの開発なので基本jsonを返す クライアント側とサーバーでこう来たらこう返すを定 義し
 その定義に沿ってレスポンスを構築する ↑これはMVCのVの役目

Slide 12

Slide 12 text

13 Client
 Server
 HTTPリクエスト
 HTTPレスポンス
 (type:json)
 構築を行うのがViewの役目


Slide 13

Slide 13 text

14 参考にしようとしたコードはこれがMに含まれていた


Slide 14

Slide 14 text

15 ふむり、、どうしようか 浅ーい経験と知識の中に一つの光が そういえばADRパターンというのがあったな

Slide 15

Slide 15 text

16 ADRパターンとは

Slide 16

Slide 16 text

17 Paul M.Jonesさんが考案した MVC Refinementとして提唱されている、MVCの派 生のパターン

Slide 17

Slide 17 text

18 ADR ● A=Action ● D=Domain ● R=Responder Action
 Domain
 Responder


Slide 18

Slide 18 text

19 ADRのD(Domain)
 
 Dはビジネスロジック!!

Slide 19

Slide 19 text

20 ADRのR(Responder) Actionから受信したデータからHTTP応答を構築す るためのプレゼンテーションロジック


Slide 20

Slide 20 text

21 ADRのA(Action) 入力(リクエスト)に基づき DomainとResponderを制御する

Slide 21

Slide 21 text

22 Client
 Server
 HTTPリクエスト
 Actionが入力を収集
 ・ドメインを呼び出し
 ・結果を保持
 ・HTTP応答を作成
 ActionがHTTP応答
 受信
 1.HTTPリクエストから入力を収集(Action)
 2.これらの入力でドメインを呼び出し(Action)
 3.結果を保持(Domain)
 4.HTTP応答を作成(Responder)
 5.HTTP応答(Controller)
 処理の流れ

Slide 22

Slide 22 text

23 MVCに似たアーキテクチャで 分かりやすい

Slide 23

Slide 23 text

24 MVCパターンとの比較

Slide 24

Slide 24 text

25 そもそもとしてなのですが、新卒でこの会社に入っ てからずっと今のプロジェクトなので、MVCでPHP のフレームワーク使って書く例はそんなには知らな い!!

Slide 25

Slide 25 text

26 そもそもADRはMVCの派生パターン Action = Controller Domain = Model Responder = View

Slide 26

Slide 26 text

27 差ほど違いがないので省略 ActionとController DomainとView

Slide 27

Slide 27 text

28 違いはResponderとViewにあ る

Slide 28

Slide 28 text

29 そもそもViewの役割って?

Slide 29

Slide 29 text

30 処理結果をユーザーにどの形 で見せるかを決める

Slide 30

Slide 30 text

31 Viewは
 ControllerでHTTPレスポンスのbodyを生成し、 HTTPヘッダの値もControllerの中で設定されま す。Viewと聞くと、ああテンプレートのことね、とい う人も多いでしょう。


Slide 31

Slide 31 text

32 それに対してResponder

Slide 32

Slide 32 text

33 Domainが出力したデータを HTTPの表現に変換する

Slide 33

Slide 33 text

34 結局の所MVCとADRって差ほ ど変わらないのでは?

Slide 34

Slide 34 text

35 大きな違いは無いがADRは MVCの上位互換

Slide 35

Slide 35 text

36 一般的に使われているMVCを 基本使うで良いがADRの考え 方を少し取り入れるだけでも 良いと思う

Slide 36

Slide 36 text

37 どんな成果に繋がったか

Slide 37

Slide 37 text

38 
 責務の切り分けが上手くできて分かりや すく機能の使いまわしがしやすいコード になった

Slide 38

Slide 38 text

39 
 コード比較

Slide 39

Slide 39 text

40 
 Before

Slide 40

Slide 40 text

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); 
 }
 }


Slide 41

Slide 41 text

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; 
 }
 }


Slide 42

Slide 42 text

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); 
 }
 }


Slide 43

Slide 43 text

44 
 After

Slide 44

Slide 44 text

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);
 }
 }
 


Slide 45

Slide 45 text

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); 
 }
 }
 


Slide 46

Slide 46 text

47 纏め

Slide 47

Slide 47 text

48 今携わっているプロジェクトは規模が大 きくADRをそのまま取り入れるのは無理 でしたが、考え方を取り入れたことによっ て取り入れる前よりも良いコードが書け たのではないかと思います

Slide 48

Slide 48 text

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


Slide 49

Slide 49 text

50 終わり