単にプログラミング言語の文法を知っているだけでは優れたプログラムは書けない。どうすればより良いコードが書けるのかを解説する。
現代的なプログラミングでは宣言的にコードを書くのが良いとされています。宣言的というのは、意図を明確にしたコーディングスタイルで、対になる概念は手続き的です。
大雑把に言ってしまえば、ある処理を行いたいときに、「どういう計算を行っていけば欲しい結果が手に入るのか」を書くのが手続き的で、「どういう結果が欲しいのか」を素直に書くのが宣言的になります。
宣言的プログラミングを考えるために、「数値の配列に対して、偶数のみを2乗した値の合計を算出する(奇数は足さない)」という問題を考えてみます。
これを手続き的に計算すると、JavaScriptではこういう関数になります。
素直な実装ですので、さほど難しくはないですね。
では、これを宣言的なスタイルで書いてみるとこうなります。
一気に行数が減っていますが、より重要なことは処理の方法がまったく異なるということです。引数の配列に対して、filterで偶数を抜き出した新しい配列を作り、その新しい配列に対してmapを適用して、要素を2乗した配列を生成しています。そして、その配列に対してreduceメソッドを使って合計を計算しています。
filter、map、reduceの処理に慣れていないと、とっつきにくい処理かもしれませんが(特にreduceメソッドはわかりにくいですよね)、1つひとつを見ると、やっていることは単純であることに気が付きます。より重要なのは、
という処理が、そのまま記述されている点です。関数の意図が明確です。
対して、最初の実装(手続き的な関数)はどうでしょうか。コードを素直に読むとこのような表現になっています。
宣言的に書いたコードと比較すると、とても説明的なコードになっているのがわかると思います。これが宣言的なスタイルと手続き的なスタイルの違いです。
もう1つ例を挙げてみましょう。あるネット販売のシステムで、購入時にユーザーに通知するメッセージを組み立てる処理を考えてみましょう。普通にメッセージを組み立てると、このような処理になると思います。
どのようなメッセージが表示されるのかパッとわかりますか? まあ、あまり複雑な処理ではないので、おおよその想像は付くかとは思います。
同じ処理を宣言的なスタイルで書くとこうなります。
ここでは文字列展開を使って実装しています。
どちらの方がわかりやすいでしょうか? 最初の実装は変数messageを更新しながら、どういう文字列が欲しいのかを組み立てていきました。まさに手続き的です。これに対して、宣言的なスタイルでは、「こういう文字列が欲しいです」ということを素直に実装しています。