何でもキレイにiterationする方法を考える in PHPぬさし(@nukisashineko)1/21
View Slide
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) 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