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
phpkaigi2022_LT_slide_nukisashineko
Search
nukisashineko
April 10, 2022
Programming
2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
phpkaigi2022_LT_slide_nukisashineko
nukisashineko
April 10, 2022
More Decks by nukisashineko
See All by nukisashineko
チームメンバーをエンパワーメントしよう! レガシープロジェクト改善事始め
nukisashineko
0
1.4k
Other Decks in Programming
See All in Programming
The Rails Doctrine Decade
koic
2
380
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
18
16k
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
360
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
380
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
370
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
260
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
540
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
6
13k
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
130
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.3k
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
150
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
350
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
310
The Cost Of JavaScript in 2023
addyosmani
55
10k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
600
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Producing Creativity
orderedlist
PRO
348
41k
Code Review Best Practice
trishagee
74
20k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
710
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
Color Theory Basics | Prateek | Gurzu
gurzu
1
470
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
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