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