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
【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産...
Search
ICKX
July 14, 2018
Programming
810
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!
PHPカンファレンス関西2018で発表した『遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!』の資料です。
ICKX
July 14, 2018
More Decks by ICKX
See All by ICKX
AIの揺らぎに“コシ”を与える階層化品質設計
ickx
0
480
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
180
階層化自動テストで開発に機動力を
ickx
1
910
検索条件にCRITERIAを
ickx
0
92
「兵法」から見る質とスピード
ickx
1
540
あなたの知らない新潟
ickx
0
100
香川にはTyrellがあるからね
ickx
0
430
品質が高いコードって何?Rev2.1
ickx
2
1.1k
品質が高いコードって何?
ickx
7
4.9k
Other Decks in Programming
See All in Programming
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
860
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
250
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
440
yield再入門 #phpcon
o0h
PRO
0
740
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
550
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
170
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
140
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3k
Foundation Models frameworkで画像分析
ryodeveloper
1
140
共通化で考えるべきは、実装より公開する型だった
codeegg
0
280
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Docker and Python
trallard
47
4k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Deep Space Network (abreviated)
tonyrice
0
230
The Curse of the Amulet
leimatthew05
2
13k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.3k
How to Ace a Technical Interview
jacobian
281
24k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
440
Transcript
None
• • https://ickx.jp/ • 要はゲームの実開発と経理以外全部 • • • • •
Notice絶対許さない • https://qiita.com/ProjectICKX
• 同じ目的や趣味を持っている人。同好の人。どうにん。 • OSS活動となんか違うの? あんま違わない • • • Flywheel2 •
次(予定) 今
• 2010年 設計・実装を開始 • 俺たちが定時に帰るためのフレームワーク • 定時で帰るために • 十分にセキュア •
設計・実装が最速、最小 • 運用・調査・改修時の負担が最小限 • 十分な実行性能を発揮
• フローコントロール • 安全なコピペ • 遅延評価
フローコントロール
• ですので、こんな地獄味のあるコードも書けます 本来は既存にあえて寄せる事でFW2固有の機能を学習しやすくするための 振る舞いであり、このような時間が無い場合の緊急避難として使う事は 推奨されません
None
• ”値”、”状態”を管理 制御、実行の流れを制御する クラス • • • •
• Action 任意の callableな値 • • • Rule
• 実行直前 フローコントロール メタプログラミング • 一番最初に実行 ルールにある判定条件に従って 制御内容を実行するか • コンテキストスイッチ
検証設定など一部を除き共通で使用できる設定
Rule実行 リクエスト マッチしたルール 検証 処理 次処理指示 処理 次処理指示 エラー処理 FW起動
各種設定 ミドルウェア Etc… 検証OK 検証NG
① 対象ルールの起動トリガ クラス定数はデフォルト動作 ’submit’とあるのはisset($_POST[‘submit’)時の処理 ② トリガに対して実行するアクションリスト ここでは実行したい順にアクションを複数並べています これを「アクションチェイン」とよびます ③ 検証内容の設定リスト
特に指定が無い場合キー名に紐づく$_POSTの値を検証します ④ 検証が設定されている場合は検証通過時に実行するアクション ⑤ 検証失敗時に実行されるアクション ⑥ 次処理の指定 特に指定が無い場合、指定されたURLへForwardします ① ② ③ ④ ⑤ ⑥
① 対象ルールの起動トリガ クラス定数はデフォルト動作 ’submit’とあるのはisset($_POST[‘submit’)時の処理 ② トリガに対して実行するアクションリスト ここでは実行したい順にアクションを複数並べています これを「アクションチェイン」とよびます ③ 検証内容の設定リスト
特に指定が無い場合キー名に紐づく$_POSTの値を検証します ④ 検証が設定されている場合は検証通過時に実行するアクション ⑤ 検証失敗時に実行されるアクション ⑥ 次処理の指定 特に指定が無い場合、指定されたURLへForwardします
① 対象ルールの起動トリガ クラス定数はデフォルト動作 ’submit’とあるのはisset($_POST[‘submit’)時の処理 ② トリガに対して実行するアクションリスト ここでは実行したい順にアクションを複数並べています これを「アクションチェイン」とよびます ③ 検証内容の設定リスト
特に指定が無い場合キー名に紐づく$_POSTの値を検証します ④ 検証が設定されている場合は検証通過時に実行するアクション ⑤ 検証失敗時に実行されるアクション ⑥ 次処理の指定 特に指定が無い場合、指定されたURLへForwardします
① 対象ルールの起動トリガ クラス定数はデフォルト動作 ’submit’とあるのはisset($_POST[‘submit’)時の処理 ② トリガに対して実行するアクションリスト ここでは実行したい順にアクションを複数並べています これを「アクションチェイン」とよびます ③ 検証内容の設定リスト
特に指定が無い場合キー名に紐づく$_POSTの値を検証します ④ 検証が設定されている場合は検証通過時に実行するアクション ⑤ 検証失敗時に実行されるアクション ⑥ 次処理の指定 特に指定が無い場合、指定されたURLへForwardします
ルールシステムの例では全て配列で設定していました 実行効率を優先する環境では良いのですが、後ほど説明する遅延評価付のアクションビルダーの構築が難しくなっていました そこで、アクションビルダーを用意しています アクションビルダーは通常、次の3点を設定します 実行する処理である「アクション」 処理の引数「パラメータ」 実行結果にラベルをつけて保持する「エイリアス」 パラメータ 処理結果の別名 アクション
ルールシステムの例では全て配列で設定していました 実行効率を優先する環境では良いのですが、後ほど説明する遅延評価付のアクションビルダーの構築が難しくなっていました そこで、アクションビルダーを用意しています アクションビルダーは通常、次の3点を設定します 実行する処理である「アクション」 処理の引数「パラメータ」 実行結果にラベルをつけて保持する「エイリアス」
① ② ③ ④ ⑤ ① モデルに対して検索を指示し、検索結果にラベルを付けて保存 ② 検索結果からリストと件数を分けてラベルを付けて保存 ③
ページャー用のデータ計算機に件数と現在のページ番号を渡し、ページャー情報を構築、保存 ④ 常にワンタイムトークンを発行しているので設定 ⑤ 状況により検索結果を一時セッションに保存しているので、良い感じにアジャスト このような構造とすることで、コントローラをフローコントロールに集中させる事ができます
① モデルに対して検索を指示し、検索結果にラベルを付けて保存 ② 検索結果からリストと件数を分けてラベルを付けて保存 ③ ページャー用のデータ計算機に件数と現在のページ番号を渡し、ページャー情報を構築、保存 ④ 常にワンタイムトークンを発行しているので設定 ⑤ 状況により検索結果を一時セッションに保存しているので、良い感じにアジャスト
このような構造とすることで、コントローラをフローコントロールに集中させる事ができます
安全なコピペ
コピー
None
None
アクションセットをコピーしてモデルやページに紐づくコンテキストだけ変えれば、 誰でも簡単に同じサービスレベルの検索機能を提供できる! コピー時にロジックの変更が一切発生しないため、安全に信頼できる機能を実現できます 更に引数の取り扱いだけ気にすればいいため、注意しなければならない事が激減し、 旧来のPHPの取り扱いと同様になるため、PSR-7などに慣れていない方でも 高速に立ち上がる事が期待できます ※ちなみにaliasをあえて変えているのはtpl上の変数を追う時に楽をしたり、 一括置換時に事故れなくするためです 『良い運用は楽な調査から』
• • • • • 遅延評価
遅延評価
• 値の評価を期待したタイミングまで遅らせる •
FW2のアクションビルダー上では単純にそのまま値を渡せば正格評価パラメータ $this->bindメソッドの返り値を与えれば遅延評価パラメータとなります 値を設定する際にメソッドでラップするだけなので、実装者はメンタルモデルの更新が必要ありません そのため、今までの書き方と大きく変わらず、実装者に学習コストをかける事なく、直観的に設定を行うことができます 正格評価パラメータ 遅延評価パラメータ
FW2のアクションビルダー上では単純にそのまま値を渡せば正格評価パラメータ $this->bindメソッドの返り値を与えれば遅延評価パラメータとなります 値を設定する際にメソッドでラップするだけなので、実装者はメンタルモデルの更新が必要ありません そのため、今までの書き方と大きく変わらず、実装者に学習コストをかける事なく、直観的に設定を行うことができます
先ほどの例の$this->bindの中身です BindBuilderのexecuterが実行され、 後で評価するための値が設定されます 最後にどのように評価するかを 設定して終わります
FW2コントローラでは実行効率のために コントローラ側で同じ実装を持ちます 今回の設定ではこちらが動作します もともとはViewRenderのための 値を持つプロパティから値を取得します ここのキー名が、ActionBuilderで 設定していたaliasとなります $this->_controllerに今、実行している controllerが設定されているため、 先の説明の通り、コントローラが
値や状態を管理できる状態を 実現しています
FW2コントローラでは実行効率のために コントローラ側で同じ実装を持ちます 今回の設定ではこちらが動作します もともとはViewRenderのための 値を持つプロパティから値を取得します ここのキー名が、ActionBuilderで 設定していたaliasとなります $this->_controllerに今、実行している controllerが設定されているため、 先の説明の通り、コントローラが
値や状態を管理できる状態を 実現しています
None
• • • • 定時で帰ろう
• • https://github.com/ProjectICKX/fw2/ • https://packagist.org/packages/ickx/fw2 • https://wkbd.ickx.jp/fw/ • • https://twitter.com/effy_staffs
None