$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

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


    2/21

    View Slide

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




    3/21

    View Slide

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

    View Slide

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

    View Slide

  6. 変換・グルーピング・集約の関数化
    奇数の場合は2乗した値に置き換えて!
    偶数・奇数で配列を分けてほしい!
    分けた配列の各小計を出してほしい!
    range(1, 10) という配列を
    問題1-解:分割
    関 数 に 分 け る こ と で M A I N が す っ き り
    6/21

    View Slide

  7. 変換
    (e.g.
    array_cloumn,
    array_map
    )
    配列操作の基本
    これらを一緒にやるからスパゲッティーになる
    グルーピング
    (e.g.
    array_filter,
    array_​
    chunk
    )
    集約
    (e.g.
    array_sum,
    array_reduce
    )




    7/21

    View Slide

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




    8/21

    View Slide

  9. 変換
    列の追加、
    値の書き換え、
    特定列の抽出
    配列操作の基本
    これらを一緒にやるからスパゲッティーになる
    グルーピング
    フィルター
    配列の区切り追加
    集約
    小計の算出
    groupby
    ※全ての配列を評価する
    遅延・並列処理
    計算処理の中断
    非同期処理の同時実行
    ※1、2個目の特殊例
    9/21

    View Slide

  10. 変換・グルーピングの特殊例
    遅延処理
    通常処理と遅延処理の違い 配列 ~~~ 配列 関数
    関数実行前:通常処理
    関数実行後:通常処理
    関数実行前:遅延処理
    関数実行後:遅延処理
    先頭5個を取得:遅延処理
    undefined
    値有り
    関数有り
    10/21

    View Slide

  11. 遅延処理 (Generator)
    return を利用しない書き方
    配列へのappend 記述行を yield と置き換え
    遅延処理:書き方
    記 法 だ け 記 す 、 実 際 の 置 き 換 え は 後 で
    11/21

    View Slide

  12. 変換の特殊例
    並列処理
    通常処理と並列処理の違い 配列 ~~~ 配列 関数
    0step実行後:通常処理
    1step実行後:通常処理
    2step実行後:通常処理
    0step実行後:並列処理
    1step実行後:並列処理
    undefined
    値有り
    関数有り
    12/21

    View Slide

  13. 並列処理 (Generator+ Promise)
    Promiseだけで書くとforeachが複雑化する
    Generator + Promise と覚えること
    補足: Promise = 非同期処理
    並列処理:書き方
    記 法 だ け 記 す 、 実 際 の 置 き 換 え は 後 で
    13/21

    View Slide

  14. 変換・グルーピング・集約の関数化
    奇数の場合は2乗した値に置き換えて!
    偶数・奇数で配列を分けてほしい!
    分けた配列の各小計を出してほしい!
    range(1, 10) という配列を
    問題1-解:分割
    さ っ き の 問 題 の お さ ら い
    14/21

    View Slide

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

    View Slide

  16. 問題1と2の解比較(抜粋・遅延)

    View Slide

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

    View Slide

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

    View Slide

  19. 習った問題を身近に感じる
    ユーザーに変換してほしい(APIで)
    deleted_atで配列を分けてほしい!
    先頭各5個ずつまで
    課金額の各小計を出してほしい!
    ※無駄な取得・計算をなるべくしない
    range(1, 100) という配列を
    問題3-解:具象例
    変 換 ・ グ ル ー ピ ン グ ・ 集 約 を 意 識 す る
    19/21

    View Slide

  20. キレイに ITERATION する方法のまとめ
    配列操作を分類整理して、1つのforeachで1つのことだけ行うことを心がける
    特殊な処理を分離
    遅延処理
    Genarator を利用する
    並列処理
    Promise + Genarator を利用する
    関数に分ける
    処理をわかりやすく書く
    hint:
    短縮記述の標準関数を覚える
    処理毎にFOREACHを分ける
    変換
    グルーピング
    集約
    20/21

    View Slide

  21. ご清聴ありがとう
    ございました。
    21/21

    View Slide

  22. 以後資料用ページ

    View Slide

  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

    View Slide