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.5k
phpkaigi2022_LT_slide_nukisashineko
nukisashineko
April 10, 2022
Tweet
Share
More Decks by nukisashineko
See All by nukisashineko
チームメンバーをエンパワーメントしよう! レガシープロジェクト改善事始め
nukisashineko
0
1k
Other Decks in Programming
See All in Programming
Honoをフロントエンドで使う 3つのやり方
yusukebe
7
3.3k
Domain-Driven Transformation
hschwentner
2
1.9k
コミュニティ駆動 AWS CDK ライブラリ「Open Constructs Library」 / community-cdk-library
gotok365
2
120
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
780
技術を根付かせる / How to make technology take root
kubode
1
250
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
270
Software Architecture
hschwentner
6
2.1k
Honoとフロントエンドの 型安全性について
yodaka
7
1.2k
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
富山発の個人開発サービスで日本中の学校の業務を改善した話
krpk1900
4
390
SpringBoot3.4の構造化ログ #kanjava
irof
2
1k
Ruby on cygwin 2025-02
fd0
0
140
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
67
4.6k
Site-Speed That Sticks
csswizardry
4
380
The Language of Interfaces
destraynor
156
24k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
A better future with KSS
kneath
238
17k
Embracing the Ebb and Flow
colly
84
4.6k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Become a Pro
speakerdeck
PRO
26
5.1k
Music & Morning Musume
bryan
46
6.3k
Practical Orchestrator
shlominoach
186
10k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
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