Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産...
Search
ICKX
July 14, 2018
Programming
830
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!
PHPカンファレンス関西2018で発表した『遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!』の資料です。
ICKX
July 14, 2018
Transcript
37 slides
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
More Decks by ICKX
See All by ICKX
AIの揺らぎに“コシ”を与える階層化品質設計
ickx
0
730
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
230
階層化自動テストで開発に機動力を
ickx
1
1k
検索条件にCRITERIAを
ickx
0
110
「兵法」から見る質とスピード
ickx
1
630
あなたの知らない新潟
ickx
0
120
香川にはTyrellがあるからね
ickx
0
480
品質が高いコードって何?Rev2.1
ickx
2
1.2k
品質が高いコードって何?
ickx
7
5.1k
Other Decks in Programming
See All in Programming
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
180
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
250
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
260
はじめてのPLATEAU
nokonoko1203
1
640
Spec-driven Development with AI
simas
PRO
0
2.3k
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
AIが実装を担う時代の「技術設計」と「チームマネジメント」
kamina_zzz
2
260
[DroidKnights 2026] Workflow AX: From Auto-Documented Policies to E2E Testing
raeminkang
0
570
SODA - FACT BOOK(JP)
sodainc
1
40k
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
420
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
4
4.2k
TS 7.0 で baseUrl が使えなくなった今、パスエイリアスをどうするか
bicstone
2
630
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3.1k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
610
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
940
Unsuck your backbone
ammeep
672
58k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.9k
Making the Leap to Tech Lead
cromwellryan
135
10k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
300
How to Ace a Technical Interview
jacobian
280
24k
Optimizing for Happiness
mojombo
378
71k
Everyday Curiosity
cassininazir
0
400
We Have a Design System, Now What?
morganepeng
55
8.4k