$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産...
Search
ICKX
July 14, 2018
Programming
0
760
【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!
PHPカンファレンス関西2018で発表した『遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!』の資料です。
ICKX
July 14, 2018
Tweet
Share
More Decks by ICKX
See All by ICKX
階層化自動テストで開発に機動力を
ickx
1
710
検索条件にCRITERIAを
ickx
0
57
「兵法」から見る質とスピード
ickx
1
430
あなたの知らない新潟
ickx
0
60
香川にはTyrellがあるからね
ickx
0
320
品質が高いコードって何?Rev2.1
ickx
2
950
品質が高いコードって何?
ickx
7
4.5k
【PHPerKaigi2021】PHPでCSVを安心して扱うために
ickx
4
3.1k
【PHPerKaigi2020】ぼくのかんがえたさいつよQueryBuilder
ickx
0
1.1k
Other Decks in Programming
See All in Programming
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
110
UIデザインに役立つ 2025年の最新CSS / The Latest CSS for UI Design 2025
clockmaker
18
7k
Microservices Platforms: When Team Topologies Meets Microservices Patterns
cer
PRO
1
950
AWS CDKの推しポイントN選
akihisaikeda
1
240
dotfiles 式年遷宮 令和最新版
masawada
1
690
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
6
290
NUMA環境とコンテナランタイム ― youki における Linux Memory Policy 実装
n4mlz
1
200
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
1
210
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
3
770
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
150
AIコードレビューがチームの"文脈"を 読めるようになるまで
marutaku
0
330
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
230
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
480
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Git: the NoSQL Database
bkeepers
PRO
432
66k
For a Future-Friendly Web
brad_frost
180
10k
GraphQLとの向き合い方2022年版
quramy
50
14k
How to train your dragon (web standard)
notwaldorf
97
6.4k
How to Think Like a Performance Engineer
csswizardry
28
2.3k
Building Applications with DynamoDB
mza
96
6.8k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Bash Introduction
62gerente
615
210k
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