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

【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!

ICKX
July 14, 2018

 【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!

PHPカンファレンス関西2018で発表した『遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!』の資料です。

ICKX

July 14, 2018
Tweet

More Decks by ICKX

Other Decks in Programming

Transcript

  1. View Slide


  2. • https://ickx.jp/
    • 要はゲームの実開発と経理以外全部




    • Notice絶対許さない
    • https://qiita.com/ProjectICKX

    View Slide

  3. • 同じ目的や趣味を持っている人。同好の人。どうにん。
    • OSS活動となんか違うの? あんま違わない


    • Flywheel2

    次(予定)

    View Slide

  4. • 2010年 設計・実装を開始
    • 俺たちが定時に帰るためのフレームワーク
    • 定時で帰るために
    • 十分にセキュア
    • 設計・実装が最速、最小
    • 運用・調査・改修時の負担が最小限
    • 十分な実行性能を発揮

    View Slide

  5. • フローコントロール
    • 安全なコピペ

    遅延評価

    View Slide

  6. フローコントロール

    View Slide


  7. ですので、こんな地獄味のあるコードも書けます
    本来は既存にあえて寄せる事でFW2固有の機能を学習しやすくするための
    振る舞いであり、このような時間が無い場合の緊急避難として使う事は
    推奨されません

    View Slide

  8. View Slide

  9. • ”値”、”状態”を管理
    制御、実行の流れを制御する
    クラス




    View Slide


  10. Action
    任意の callableな値



    Rule

    View Slide

  11. • 実行直前
    フローコントロール
    メタプログラミング
    • 一番最初に実行
    ルールにある判定条件に従って 制御内容を実行するか

    コンテキストスイッチ
    検証設定など一部を除き共通で使用できる設定

    View Slide

  12. Rule実行
    リクエスト マッチしたルール
    検証
    処理
    次処理指示
    処理
    次処理指示
    エラー処理
    FW起動
    各種設定
    ミドルウェア
    Etc…
    検証OK 検証NG

    View Slide

  13. ① 対象ルールの起動トリガ
    クラス定数はデフォルト動作
    ’submit’とあるのはisset($_POST[‘submit’)時の処理
    ② トリガに対して実行するアクションリスト
    ここでは実行したい順にアクションを複数並べています
    これを「アクションチェイン」とよびます
    ③ 検証内容の設定リスト
    特に指定が無い場合キー名に紐づく$_POSTの値を検証します
    ④ 検証が設定されている場合は検証通過時に実行するアクション
    ⑤ 検証失敗時に実行されるアクション
    ⑥ 次処理の指定
    特に指定が無い場合、指定されたURLへForwardします






    View Slide

  14. ① 対象ルールの起動トリガ
    クラス定数はデフォルト動作
    ’submit’とあるのはisset($_POST[‘submit’)時の処理
    ② トリガに対して実行するアクションリスト
    ここでは実行したい順にアクションを複数並べています
    これを「アクションチェイン」とよびます
    ③ 検証内容の設定リスト
    特に指定が無い場合キー名に紐づく$_POSTの値を検証します
    ④ 検証が設定されている場合は検証通過時に実行するアクション
    ⑤ 検証失敗時に実行されるアクション
    ⑥ 次処理の指定
    特に指定が無い場合、指定されたURLへForwardします

    View Slide

  15. ① 対象ルールの起動トリガ
    クラス定数はデフォルト動作
    ’submit’とあるのはisset($_POST[‘submit’)時の処理
    ② トリガに対して実行するアクションリスト
    ここでは実行したい順にアクションを複数並べています
    これを「アクションチェイン」とよびます
    ③ 検証内容の設定リスト
    特に指定が無い場合キー名に紐づく$_POSTの値を検証します
    ④ 検証が設定されている場合は検証通過時に実行するアクション
    ⑤ 検証失敗時に実行されるアクション
    ⑥ 次処理の指定
    特に指定が無い場合、指定されたURLへForwardします

    View Slide

  16. ① 対象ルールの起動トリガ
    クラス定数はデフォルト動作
    ’submit’とあるのはisset($_POST[‘submit’)時の処理
    ② トリガに対して実行するアクションリスト
    ここでは実行したい順にアクションを複数並べています
    これを「アクションチェイン」とよびます
    ③ 検証内容の設定リスト
    特に指定が無い場合キー名に紐づく$_POSTの値を検証します
    ④ 検証が設定されている場合は検証通過時に実行するアクション
    ⑤ 検証失敗時に実行されるアクション
    ⑥ 次処理の指定
    特に指定が無い場合、指定されたURLへForwardします

    View Slide

  17. ルールシステムの例では全て配列で設定していました
    実行効率を優先する環境では良いのですが、後ほど説明する遅延評価付のアクションビルダーの構築が難しくなっていました
    そこで、アクションビルダーを用意しています
    アクションビルダーは通常、次の3点を設定します
    実行する処理である「アクション」
    処理の引数「パラメータ」
    実行結果にラベルをつけて保持する「エイリアス」
    パラメータ 処理結果の別名
    アクション

    View Slide

  18. ルールシステムの例では全て配列で設定していました
    実行効率を優先する環境では良いのですが、後ほど説明する遅延評価付のアクションビルダーの構築が難しくなっていました
    そこで、アクションビルダーを用意しています
    アクションビルダーは通常、次の3点を設定します
    実行する処理である「アクション」
    処理の引数「パラメータ」
    実行結果にラベルをつけて保持する「エイリアス」

    View Slide






  19. ① モデルに対して検索を指示し、検索結果にラベルを付けて保存
    ② 検索結果からリストと件数を分けてラベルを付けて保存
    ③ ページャー用のデータ計算機に件数と現在のページ番号を渡し、ページャー情報を構築、保存
    ④ 常にワンタイムトークンを発行しているので設定
    ⑤ 状況により検索結果を一時セッションに保存しているので、良い感じにアジャスト
    このような構造とすることで、コントローラをフローコントロールに集中させる事ができます

    View Slide

  20. ① モデルに対して検索を指示し、検索結果にラベルを付けて保存
    ② 検索結果からリストと件数を分けてラベルを付けて保存
    ③ ページャー用のデータ計算機に件数と現在のページ番号を渡し、ページャー情報を構築、保存
    ④ 常にワンタイムトークンを発行しているので設定
    ⑤ 状況により検索結果を一時セッションに保存しているので、良い感じにアジャスト
    このような構造とすることで、コントローラをフローコントロールに集中させる事ができます

    View Slide

  21. 安全なコピペ

    View Slide

  22. コピー

    View Slide

  23. View Slide

  24. View Slide

  25. アクションセットをコピーしてモデルやページに紐づくコンテキストだけ変えれば、
    誰でも簡単に同じサービスレベルの検索機能を提供できる!
    コピー時にロジックの変更が一切発生しないため、安全に信頼できる機能を実現できます
    更に引数の取り扱いだけ気にすればいいため、注意しなければならない事が激減し、
    旧来のPHPの取り扱いと同様になるため、PSR-7などに慣れていない方でも
    高速に立ち上がる事が期待できます
    ※ちなみにaliasをあえて変えているのはtpl上の変数を追う時に楽をしたり、
    一括置換時に事故れなくするためです
    『良い運用は楽な調査から』

    View Slide





  26. • 遅延評価

    View Slide

  27. 遅延評価

    View Slide


  28. 値の評価を期待したタイミングまで遅らせる

    View Slide

  29. FW2のアクションビルダー上では単純にそのまま値を渡せば正格評価パラメータ
    $this->bindメソッドの返り値を与えれば遅延評価パラメータとなります
    値を設定する際にメソッドでラップするだけなので、実装者はメンタルモデルの更新が必要ありません
    そのため、今までの書き方と大きく変わらず、実装者に学習コストをかける事なく、直観的に設定を行うことができます
    正格評価パラメータ
    遅延評価パラメータ

    View Slide

  30. FW2のアクションビルダー上では単純にそのまま値を渡せば正格評価パラメータ
    $this->bindメソッドの返り値を与えれば遅延評価パラメータとなります
    値を設定する際にメソッドでラップするだけなので、実装者はメンタルモデルの更新が必要ありません
    そのため、今までの書き方と大きく変わらず、実装者に学習コストをかける事なく、直観的に設定を行うことができます

    View Slide

  31. 先ほどの例の$this->bindの中身です
    BindBuilderのexecuterが実行され、
    後で評価するための値が設定されます
    最後にどのように評価するかを
    設定して終わります

    View Slide

  32. FW2コントローラでは実行効率のために
    コントローラ側で同じ実装を持ちます
    今回の設定ではこちらが動作します
    もともとはViewRenderのための
    値を持つプロパティから値を取得します
    ここのキー名が、ActionBuilderで
    設定していたaliasとなります
    $this->_controllerに今、実行している
    controllerが設定されているため、
    先の説明の通り、コントローラが
    値や状態を管理できる状態を
    実現しています

    View Slide

  33. FW2コントローラでは実行効率のために
    コントローラ側で同じ実装を持ちます
    今回の設定ではこちらが動作します
    もともとはViewRenderのための
    値を持つプロパティから値を取得します
    ここのキー名が、ActionBuilderで
    設定していたaliasとなります
    $this->_controllerに今、実行している
    controllerが設定されているため、
    先の説明の通り、コントローラが
    値や状態を管理できる状態を
    実現しています

    View Slide

  34. View Slide




  35. • 定時で帰ろう

    View Slide


  36. • https://github.com/ProjectICKX/fw2/
    • https://packagist.org/packages/ickx/fw2
    • https://wkbd.ickx.jp/fw/

    • https://twitter.com/effy_staffs

    View Slide

  37. View Slide