JavaScriptのfor loop構文は、これまでよく使われてきましたが、今では新しいプログラミング技術の台頭によって引退すべき状態です。
これはあなたにプログラミングのエキスパートになれというものではなく、単なる変更レベルのもので、今携わっているプロジェクトですぐに試せるものです。
JavaScriptのfor loop構文の何が問題なのでしょうか?
for loop構文の設計は、状態の変異と副作用の利用を助長し、それらはバグや予測不可能なコードの発生する原因になりえます。
グローバル・ステートは悪くて避けるべきとよく聞いてきました。
ローカル・ステートもグローバル・ステートと同じくらいよくないのですが、影響が小さいのであまり気づきません。
問題を解決せずに、その影響を最小化してきました。
よくわからない理由で変数が変わってしまい、デバッグや値が変わった理由を探すのにものすごい時間を使ったことはありませんか?
次に副作用について少しお話させてください。
誰も自分のプログラムに副作用があって欲しくないですよね?
しかし、副作用とは何でしょうか?
関数がスコープ外の何か、変数の値の変更、キーボードからの入力情報の参照、APIコールの実施、ディスクへのデータの書き込み、コンソールへのログの出力など、を変更することがあるとき、副作用と持つと言われます。
副作用は強力なのですが、強い力を持つことは大きな責任を負うということです。
カプセル化され管理されている場合、副作用は現れません。
副作用ありの関数は、テストおよび理解が難しいので、可能ならば取り除くべきです。
それでは、何度も見たであろう典型的なfor loop構文を見ていきましょう。
このコードのリファクターリングを徐々に行って、あなたのコードをより美しく変更させるのが簡単だということを示したいと思います。
最初のステップでは、if構文を取り除くことです。
if構文を取り除くのは一般的によい練習です。
7ヶ月未満の子猫(kitten)という抽出条件の部分が大きな変更になります。
コードを読めば意図が理解できるでしょう。
他の利点は、isKittenが再利用可能だということで、再利用可能なコードは常にゴールの一つであるべきです。
次の変更は、catオブジェクトから名前を取り出す部分です。
この変更が意味を成すのは少し後ですが、ここは信じてください。
filterとmapの構造について数パラグラフ書くことも考えましたが、ここではそれをせず、次のコードが簡単に読めて理解できることを示したいと思います。
kittens.push(…)という記述がなくなっていることに気づくと思います。
Varやletではなく、constを使っているコードはものすごくセクシーですよね。
Constはオブジェクトを不変にしないので、私たちはconstを使ってきました。
最後のリファクタリングでは、関数からfilterとmapを取り除きます。
この関数をこれ以上どのように分解しますか?
未満の部分、プロパティのname、mapやfilterについて考えてみてください。
興味のある方は、Composeについて調べてみてください。
※本稿は「Rethinking JavaScript: Death of the For Loop」を翻訳・再編集したものです。