Upgrade to Pro — share decks privately, control downloads, hide ads and more …

phpkaigi2022_LT_slide_nukisashineko

 phpkaigi2022_LT_slide_nukisashineko

nukisashineko

April 10, 2022
Tweet

More Decks by nukisashineko

Other Decks in Programming

Transcript

  1. 何でもキレイに iterationする方法 を考える in PHP ぬさし(@nukisashineko) 1/21

  2. foreach スパゲッティー 経験ある? なぜなのか? FOREACHって実は難しい 自分はよくある レビューでもみかける 何もしてないのに…… すぐ複雑化する 2/21

  3. 変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約

    小計の算出 groupby ※全ての配列を評価する … … … … 3/21
  4. 変換・グルーピング・集約が無秩序 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:単純 一 つ

    の F O E A C H に 全 部 詰 め ち ゃ っ た 4/21
  5. 変換・グルーピング・集約を整理 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:区切 F O

    R E A C H 処 理 毎 に 分 け て 見 通 し よ く 5/21
  6. 変換・グルーピング・集約の関数化 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:分割 関 数

    に 分 け る こ と で M A I N が す っ き り 6/21
  7. 変換 (e.g. array_cloumn, array_map ) 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング (e.g. array_filter,

    array_​ chunk ) 集約 (e.g. array_sum, array_reduce ) … … … … 7/21
  8. 変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約

    小計の算出 groupby ※全ての配列を評価する … … … … 8/21
  9. 変換 列の追加、 値の書き換え、 特定列の抽出 配列操作の基本 これらを一緒にやるからスパゲッティーになる グルーピング フィルター 配列の区切り追加 集約

    小計の算出 groupby ※全ての配列を評価する 遅延・並列処理 計算処理の中断 非同期処理の同時実行 ※1、2個目の特殊例 9/21
  10. 変換・グルーピングの特殊例 遅延処理 通常処理と遅延処理の違い 配列 ~~~ 配列 関数 関数実行前:通常処理 関数実行後:通常処理 関数実行前:遅延処理

    関数実行後:遅延処理 先頭5個を取得:遅延処理 undefined 値有り 関数有り 10/21
  11. 遅延処理 (Generator) <yield記法> return を利用しない書き方 配列へのappend 記述行を yield と置き換え 遅延処理:書き方

    記 法 だ け 記 す 、 実 際 の 置 き 換 え は 後 で 11/21
  12. 変換の特殊例 並列処理 通常処理と並列処理の違い 配列 ~~~ 配列 関数 0step実行後:通常処理 1step実行後:通常処理 2step実行後:通常処理

    0step実行後:並列処理 1step実行後:並列処理 undefined 値有り 関数有り 12/21
  13. 並列処理 (Generator+ Promise) Promiseだけで書くとforeachが複雑化する Generator + Promise と覚えること 補足: Promise

    = 非同期処理 並列処理:書き方 記 法 だ け 記 す 、 実 際 の 置 き 換 え は 後 で 13/21
  14. 変換・グルーピング・集約の関数化 奇数の場合は2乗した値に置き換えて! 偶数・奇数で配列を分けてほしい! 分けた配列の各小計を出してほしい! range(1, 10) という配列を 問題1-解:分割 さ っ

    き の 問 題 の お さ ら い 14/21
  15. 変換・グルーピングの遅延化 奇数の場合は2乗した値に変換!(APIで) 偶数・奇数で配列を分けてほしい! 先頭各5個ずつまで 分けた配列の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題2-解:遅延

    遅 延 処 理 に 置 き 換 え 、 変 更 点 は 次 ペ ー ジ 15/21
  16. 問題1と2の解比較(抜粋・遅延)

  17. 問題1と2の解比較(抜粋・並列)

  18. 変換・グルーピングの遅延化 奇数の場合は2乗した値に変換!(APIで) 偶数・奇数で配列を分けてほしい! 先頭各5個ずつまで 分けた配列の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題2-解:遅延

    お さ ら い 、 問 題 が 非 効 率 で 例 に 適 さ な い 18/21
  19. 習った問題を身近に感じる ユーザーに変換してほしい(APIで) deleted_atで配列を分けてほしい! 先頭各5個ずつまで 課金額の各小計を出してほしい! ※無駄な取得・計算をなるべくしない range(1, 100) という配列を 問題3-解:具象例

    変 換 ・ グ ル ー ピ ン グ ・ 集 約 を 意 識 す る 19/21
  20. キレイに ITERATION する方法のまとめ 配列操作を分類整理して、1つのforeachで1つのことだけ行うことを心がける 特殊な処理を分離 遅延処理 Genarator を利用する 並列処理 Promise

    + Genarator を利用する 関数に分ける 処理をわかりやすく書く hint: 短縮記述の標準関数を覚える 処理毎にFOREACHを分ける 変換 グルーピング 集約 20/21
  21. ご清聴ありがとう ございました。 21/21

  22. 以後資料用ページ

  23. リンク 今回のソースコード ・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