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
820
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
610
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
200
階層化自動テストで開発に機動力を
ickx
1
960
検索条件にCRITERIAを
ickx
0
99
「兵法」から見る質とスピード
ickx
1
590
あなたの知らない新潟
ickx
0
110
香川にはTyrellがあるからね
ickx
0
460
品質が高いコードって何?Rev2.1
ickx
2
1.1k
品質が高いコードって何?
ickx
7
5k
Other Decks in Programming
See All in Programming
Jetpack Compose メカニズム
skydoves
0
410
Intent as Code
shoppingjaws
6
1k
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
160
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
210
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
130
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
370
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
680
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
690
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
110
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
200
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
460
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Music & Morning Musume
bryan
48
7.4k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
280
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
The Cost Of JavaScript in 2023
addyosmani
55
10k
How to Talk to Developers About Accessibility
jct
2
550
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
The Language of Interfaces
destraynor
162
27k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
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