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
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
490
2025 年のコーディングエージェントの現在地とエンジニアの仕事の変化について
azukiazusa1
24
12k
AI時代のUIはどこへ行く?
yusukebe
18
9k
Namespace and Its Future
tagomoris
6
710
楽して成果を出すためのセルフリソース管理
clipnote
0
180
ぬるぬる動かせ! Riveでアニメーション実装🐾
kno3a87
1
230
RDoc meets YARD
okuramasafumi
4
170
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
450
AIと私たちの学習の変化を考える - Claude Codeの学習モードを例に
azukiazusa1
10
4.4k
Reading Rails 1.0 Source Code
okuramasafumi
0
250
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
1.8k
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.1k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.1k
Navigating Team Friction
lara
189
15k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
A Tale of Four Properties
chriscoyier
160
23k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
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