avoid-forlisted
Install: claude install-skill ncaq/konoka
# `for`文をなるべく避ける
`for`文は強力すぎて、
コードの意図が読み取りにくくなります。
構造化プログラミングにおいて`goto`相当の機能を避けるのと同じ理由で、
`for`文もなるべく避けてください。
避ける対象は以下の全てです。
- C言語方式の`for (let i = 0; i < n; i++)`
- `for...of`
- `for...in`
forではありませんが、
同じくループ構文の以下も避けてください。
- `while`
- `do...while`
## なぜ避けるのか
`for`文は何でもできてしまいます。
- 要素の変換
- 絞り込み
- 集計
- 検索
- 副作用の実行
どの操作をしているのかはループ本体を注意深く読まないと分かりません。
`map`や`filter`のような高抽象度の関数は、
名前を見ただけで「変換している」「絞り込んでいる」と意図が伝わります。
`goto`が制御フローを自由にしすぎて構造化プログラミングで避けられたのと同じく、
`for`はデータの流れを自由にしすぎます。
より弱く意図の限定された関数に置き換えることで、
読み手の負担が減ります。
## Arrayの場合
Arrayのメソッドでやりたいことに対応するものを選びます。
| やりたいこと | `for`の代替 |
| -------------------------- | ---------------------------- |
| 各要素を変換する | `map` |
| 変換して一段平坦化する | `flatMap` |
| 条件で絞り込む | `filter` |
| 最初の一致を探す | `find` / `findIndex` |
| 最後の一致を探す | `findLast` / `findLastIndex` |
| 含まれるか調べる | `includes` |
| 位置を調べる | `indexOf` / `lastIndexOf` |
| 一つでも満たすか調べる | `some` |
| すべて満たすか調べる | `every` |
| 単一の値に集計する | `reduce` / `reduceRight` |
| 副作用だけ実行する | `forEach` |
| ネストした配列を平坦化する | `flat` |
| 文字列に連結する | `join` |
| 並べ替える | `toSorted` |
| 逆順にする | `toReversed` |
変換と絞り込みはチ