Upgrade to Pro — share decks privately, control downloads, hide ads and more …

独立したコアレイヤパターンの適用 - fortee 編 - / fortee-meets-independent-core-layer-pattern

shin1x1
November 30, 2019

独立したコアレイヤパターンの適用 - fortee 編 - / fortee-meets-independent-core-layer-pattern

2019/11/30 大改修!PHPレガシーコードビフォーアフターhttps://phperkaigi.connpass.com/event/155509/

shin1x1

November 30, 2019
Tweet

More Decks by shin1x1

Other Decks in Programming

Transcript

  1. 独立したコアレイヤパターンの適用
    fortee

    2019/11/30 PHP
    レガシーコードビフォーアフター
    @shin1x1

    View Slide

  2. @shin1x1
    新原(しんばら) 雅司
    1×
    1株式会社
    Web
    アプリケーション
    開発
    技術サポート
    PHP
    の現場 (Podcast)
    https://php-genba.shin1x1.com/
    2

    View Slide

  3. Agenda
    独立したコアレイヤパターン
    fortee
    への適用例
    まとめ
    3

    View Slide

  4. 独立したコアレイヤパターン
    4

    View Slide

  5. 独立したコアレイヤパターン
    アーキテクチャパターンの一つ
    システムを 2
    つのレイヤに分離
    コアレイヤ
    アプリケーションレイヤ
    5

    View Slide

  6. コアレイヤ
    コアロジック(What
    )を実装
    IO
    等の技術詳細は実装しない
    コアレイヤのみに依存するようにする
    フレームワークには依存しないのが理想
    ただ局所的に依存する場合もある
    ユースケース、ドメインモデルなど
    6

    View Slide

  7. インターフェイス
    コアレイヤが利用する技術詳細を
    インターフェイスで定義
    DB
    アクセス
    Mail
    送信
    API
    呼び出し
    コアレイヤのコードはインターフェイスを介して
    IO
    等の技術詳細を実装
    7

    View Slide

  8. アプリケーションレイヤ
    技術詳細(How
    )の実装
    コアレイヤで定義したインターフェイスを実装
    フレームワーク、ライブラリを活用
    UI
    からコアレイヤの実行(HTTP, CLI
    など)
    8

    View Slide

  9. 9

    View Slide

  10. 10

    View Slide

  11. 11

    View Slide

  12. ポートとアダプタ
    12

    View Slide

  13. ポートとアダプタ
    コアレイヤ:
    インターフェイス =
    ポート
    アプリケーションレイヤ:
    実装 =
    アダプタ
    13

    View Slide

  14. ポートとアダプタ
    アダプタを変えてもコアレイヤには影響しない
    14

    View Slide

  15. Ports & Adapters
    http://www.dossier-
    andreas.net/software_architecture/ports_and_adapters.html 15

    View Slide

  16. 独立したコアレイヤパターン
    コアレイヤとアプリケーションレイヤに分離
    コアレイヤ:
    コアロジック
    アプリケーションレイヤ: UI
    、技術詳細
    コアレイヤ内での IO
    処理
    コアレイヤにインターフェイス定義(ポート)
    アプリケーションレイヤで実装(アダプタ)
    16

    View Slide

  17. fortee
    への適用
    17

    View Slide

  18. fortee
    @tomzoh
    さんが、2017/12
    から開発
    CakePHP 3
    で実装
    PHP 7.2
    (今回デモ用に 7.4

    Web
    ページと API
    がエンドポイントによって混在
    18

    View Slide

  19. パターン適用対象
    プロポーザルに Fav
    を付ける、外す API
    POST /sample-conference/proposal/fav
    uuid =
    プロポーザルを示す UUID
    on = true
    なら Fav
    を付ける。それ以外なら外
    す。
    19

    View Slide

  20. 適用手順
    [core]
    コントローラのコードをユースケースに移行
    HTTP Request
    等で必要な値は引数で渡す
    HTTP Reponse
    等で必要な値は戻り値で返す
    IO
    関連の処理はインターフェイス(ポート)化
    [core]
    ユースケースのテスト
    [app]
    アダプタ実装
    [app]
    コントローラからユースケースを実行
    20

    View Slide

  21. demo
    21

    View Slide

  22. コードを役割でグループ分け
    コントローラメソッドに全てのコードがある
    役割によってグループ分け
    HTTP Request / Response
    IO (RDBMS)
    Business Logic
    22

    View Slide

  23. レイヤに分ける
    HTTP Request / Response
    --->
    アプリケーションレイヤ(Controller

    IO (RDBMS)
    --->
    コアレイヤ(ポート)
    --->
    アプリケーションレイヤ(アダプタ)
    Business Logic
    --->
    コアレイヤ(ユースケース)
    23

    View Slide

  24. 既存実装への適用アイデア
    漸進的に進める
    ロジックは同じでパターン適用
    テスト後にロジックをリファクタリング
    コアレイヤが完成したらコントローラから実行
    適用する箇所を絞る
    単純な読み込みだけなら適用しない
    ビュー用の読み込みはコントローラに残す
    24

    View Slide

  25. まとめ
    コアレイヤは、どこから呼ばれても良い
    Web, CLI, test
    コアレイヤは、IO
    の実装を知らなくて良い
    コアレイヤの適用箇所を少しづつ増やす
    0 or 100
    ではなく、除々に
    25

    View Slide

  26. Q?
    @shin1x1
    26

    View Slide