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
670
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
210
階層化自動テストで開発に機動力を
ickx
1
970
検索条件にCRITERIAを
ickx
0
99
「兵法」から見る質とスピード
ickx
1
600
あなたの知らない新潟
ickx
0
110
香川にはTyrellがあるからね
ickx
0
470
品質が高いコードって何?Rev2.1
ickx
2
1.2k
品質が高いコードって何?
ickx
7
5k
Other Decks in Programming
See All in Programming
SREの越境 / SRE Collaboration
y0hgi
2
290
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
110
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
530
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
6.1k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
33
15k
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
6
1.5k
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
4
410
mrbgem 三角測量 開発
ogom
0
190
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
6
3.9k
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
600
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.8k
Are APIs Still Relevant in the AI Era?
soyuka
0
410
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
300
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
The Cult of Friendly URLs
andyhume
79
7k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
540
Designing for Performance
lara
611
70k
Utilizing Notion as your number one productivity tool
mfonobong
4
610
Embracing the Ebb and Flow
colly
88
5.2k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
500
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
290
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