phpkaigi2022_LT_slide_nukisashineko
by
nukisashineko
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
何でもキレイに iterationする方法 を考える in PHP ぬさし(@nukisashineko) 1/21
Slide 2
Slide 2 text
foreach スパゲッティー 経験ある? なぜなのか? FOREACHって実は難しい 自分はよくある レビューでもみかける 何もしてないのに…… すぐ複雑化する 2/21
Slide 3
Slide 3 text
変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約 小計の算出 groupby ※全ての配列を評価する … … … … 3/21
Slide 4
Slide 4 text
変換・グルーピング・集約が無秩序 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:単純 一 つ の F O E A C H に 全 部 詰 め ち ゃ っ た 4/21
Slide 5
Slide 5 text
変換・グルーピング・集約を整理 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:区切 F O R E A C H 処 理 毎 に 分 け て 見 通 し よ く 5/21
Slide 6
Slide 6 text
変換・グルーピング・集約の関数化 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:分割 関 数 に 分 け る こ と で M A I N が す っ き り 6/21
Slide 7
Slide 7 text
変換 (e.g. array_cloumn, array_map ) 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング (e.g. array_filter, array_ chunk ) 集約 (e.g. array_sum, array_reduce ) … … … … 7/21
Slide 8
Slide 8 text
変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約 小計の算出 groupby ※全ての配列を評価する … … … … 8/21
Slide 9
Slide 9 text
変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約 小計の算出 groupby ※全ての配列を評価する 遅延・並列処理 計算処理の中断 非同期処理の同時実行 ※1、2個目の特殊例 9/21
Slide 10
Slide 10 text
変換・グルーピングの特殊例 遅延処理 通常処理と遅延処理の違い 配列 ~~~ 配列 関数 関数実行前:通常処理 関数実行後:通常処理 関数実行前:遅延処理 関数実行後:遅延処理 先頭5個を取得:遅延処理 undefined 値有り 関数有り 10/21
Slide 11
Slide 11 text
遅延処理 (Generator) return を利用しない書き方 配列へのappend 記述行を yield と置き換え 遅延処理:書き方 記 法 だ け 記 す 、 実 際 の 置 き 換 え は 後 で 11/21
Slide 12
Slide 12 text
変換の特殊例 並列処理 通常処理と並列処理の違い 配列 ~~~ 配列 関数 0step実行後:通常処理 1step実行後:通常処理 2step実行後:通常処理 0step実行後:並列処理 1step実行後:並列処理 undefined 値有り 関数有り 12/21
Slide 13
Slide 13 text
並列処理 (Generator+ Promise) Promiseだけで書くとforeachが複雑化する Generator + Promise と覚えること 補足: Promise = 非同期処理 並列処理:書き方 記 法 だ け 記 す 、 実 際 の 置 き 換 え は 後 で 13/21
Slide 14
Slide 14 text
変換・グルーピング・集約の関数化 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:分割 さ っ き の 問 題 の お さ ら い 14/21
Slide 15
Slide 15 text
変換・グルーピングの遅延化 奇数の場合は2乗した値に変換!(APIで) 偶数・奇数で配列を分けてほしい! 先頭各5個ずつまで 分けた配列の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題2-解:遅延 遅 延 処 理 に 置 き 換 え 、 変 更 点 は 次 ペ ー ジ 15/21
Slide 16
Slide 16 text
問題1と2の解比較(抜粋・遅延)
Slide 17
Slide 17 text
問題1と2の解比較(抜粋・並列)
Slide 18
Slide 18 text
変換・グルーピングの遅延化 奇数の場合は2乗した値に変換!(APIで) 偶数・奇数で配列を分けてほしい! 先頭各5個ずつまで 分けた配列の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題2-解:遅延 お さ ら い 、 問 題 が 非 効 率 で 例 に 適 さ な い 18/21
Slide 19
Slide 19 text
習った問題を身近に感じる ユーザーに変換してほしい(APIで) deleted_atで配列を分けてほしい! 先頭各5個ずつまで 課金額の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題3-解:具象例 変 換 ・ グ ル ー ピ ン グ ・ 集 約 を 意 識 す る 19/21
Slide 20
Slide 20 text
キレイに ITERATION する方法のまとめ 配列操作を分類整理して、1つのforeachで1つのことだけ行うことを心がける 特殊な処理を分離 遅延処理 Genarator を利用する 並列処理 Promise + Genarator を利用する 関数に分ける 処理をわかりやすく書く hint: 短縮記述の標準関数を覚える 処理毎にFOREACHを分ける 変換 グルーピング 集約 20/21
Slide 21
Slide 21 text
ご清聴ありがとう ございました。 21/21
Slide 22
Slide 22 text
以後資料用ページ
Slide 23
Slide 23 text
リンク 今回のソースコード ・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