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
phpkaigi2022_LT_slide_nukisashineko
Search
nukisashineko
April 10, 2022
Programming
0
1.7k
phpkaigi2022_LT_slide_nukisashineko
nukisashineko
April 10, 2022
Tweet
Share
More Decks by nukisashineko
See All by nukisashineko
チームメンバーをエンパワーメントしよう! レガシープロジェクト改善事始め
nukisashineko
0
1.2k
Other Decks in Programming
See All in Programming
Promise.tryで実現する新しいエラーハンドリング New error handling with Promise try
bicstone
3
1.4k
Developing Specifications - Jakarta EE: a Real World Example
ivargrimstad
0
180
2025 컴포즈 마법사
jisungbin
0
150
Building AI with AI
inesmontani
PRO
1
260
Micro Frontendsで築いた 共通基盤と運用の試行錯誤 / Building a Shared Platform with Micro Frontends: Operational Learnings
kyntk
0
120
CSC509 Lecture 13
javiergs
PRO
0
260
JEP 496 と JEP 497 から学ぶ耐量子計算機暗号入門 / Learning Post-Quantum Crypto Basics from JEP 496 & 497
mackey0225
2
460
アーキテクチャと考える迷子にならない開発者テスト
irof
9
3.3k
AI時代もSEOを頑張っている話
shirahama_x
0
160
How Software Deployment tools have changed in the past 20 years
geshan
0
4k
Microservices Platforms: When Team Topologies Meets Microservices Patterns
cer
PRO
0
470
ゼロダウンタイムでミドルウェアの バージョンアップを実現した手法と課題
wind111
0
210
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Being A Developer After 40
akosma
91
590k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Leading Effective Engineering Teams in the AI Era
addyosmani
8
1.1k
Bash Introduction
62gerente
615
210k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
Transcript
何でもキレイに iterationする方法 を考える in PHP ぬさし(@nukisashineko) 1/21
foreach スパゲッティー 経験ある? なぜなのか? FOREACHって実は難しい 自分はよくある レビューでもみかける 何もしてないのに…… すぐ複雑化する 2/21
変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約
小計の算出 groupby ※全ての配列を評価する … … … … 3/21
変換・グルーピング・集約が無秩序 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:単純 一 つ
の F O E A C H に 全 部 詰 め ち ゃ っ た 4/21
変換・グルーピング・集約を整理 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:区切 F O
R E A C H 処 理 毎 に 分 け て 見 通 し よ く 5/21
変換・グルーピング・集約の関数化 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:分割 関 数
に 分 け る こ と で M A I N が す っ き り 6/21
変換 (e.g. array_cloumn, array_map ) 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング (e.g. array_filter,
array_ chunk ) 集約 (e.g. array_sum, array_reduce ) … … … … 7/21
変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約
小計の算出 groupby ※全ての配列を評価する … … … … 8/21
変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約
小計の算出 groupby ※全ての配列を評価する 遅延・並列処理 計算処理の中断 非同期処理の同時実行 ※1、2個目の特殊例 9/21
変換・グルーピングの特殊例 遅延処理 通常処理と遅延処理の違い 配列 ~~~ 配列 関数 関数実行前:通常処理 関数実行後:通常処理 関数実行前:遅延処理
関数実行後:遅延処理 先頭5個を取得:遅延処理 undefined 値有り 関数有り 10/21
遅延処理 (Generator) <yield記法> return を利用しない書き方 配列へのappend 記述行を yield と置き換え 遅延処理:書き方
記 法 だ け 記 す 、 実 際 の 置 き 換 え は 後 で 11/21
変換の特殊例 並列処理 通常処理と並列処理の違い 配列 ~~~ 配列 関数 0step実行後:通常処理 1step実行後:通常処理 2step実行後:通常処理
0step実行後:並列処理 1step実行後:並列処理 undefined 値有り 関数有り 12/21
並列処理 (Generator+ Promise) Promiseだけで書くとforeachが複雑化する Generator + Promise と覚えること 補足: Promise
= 非同期処理 並列処理:書き方 記 法 だ け 記 す 、 実 際 の 置 き 換 え は 後 で 13/21
変換・グルーピング・集約の関数化 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:分割 さ っ
き の 問 題 の お さ ら い 14/21
変換・グルーピングの遅延化 奇数の場合は2乗した値に変換!(APIで) 偶数・奇数で配列を分けてほしい! 先頭各5個ずつまで 分けた配列の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題2-解:遅延
遅 延 処 理 に 置 き 換 え 、 変 更 点 は 次 ペ ー ジ 15/21
問題1と2の解比較(抜粋・遅延)
問題1と2の解比較(抜粋・並列)
変換・グルーピングの遅延化 奇数の場合は2乗した値に変換!(APIで) 偶数・奇数で配列を分けてほしい! 先頭各5個ずつまで 分けた配列の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題2-解:遅延
お さ ら い 、 問 題 が 非 効 率 で 例 に 適 さ な い 18/21
習った問題を身近に感じる ユーザーに変換してほしい(APIで) deleted_atで配列を分けてほしい! 先頭各5個ずつまで 課金額の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題3-解:具象例
変 換 ・ グ ル ー ピ ン グ ・ 集 約 を 意 識 す る 19/21
キレイに ITERATION する方法のまとめ 配列操作を分類整理して、1つのforeachで1つのことだけ行うことを心がける 特殊な処理を分離 遅延処理 Genarator を利用する 並列処理 Promise
+ Genarator を利用する 関数に分ける 処理をわかりやすく書く hint: 短縮記述の標準関数を覚える 処理毎にFOREACHを分ける 変換 グルーピング 集約 20/21
ご清聴ありがとう ございました。 21/21
以後資料用ページ
リンク 今回のソースコード ・https://github.com/nukisashineko/phpkaigi2022-lt-beautiful-iteration- guide 参考資料 ・https://docs.guzzlephp.org/en/stable/quickstart.html#async-requests その他 ・資料作成 ・https://www.canva.com/ ・スライド公開先URL
・https://speakerdeck.com/nukisashineko/phpkaigi2022-lt-slide- draftfalsekopifalsekopi-3