純粋関数とは
純粋関数は処理の複雑度を決める鍵でもある。
一つのソフトウェアで純粋関数を割合が多ければ多いほど、システム全体の複雑度は下がる。
では何を純粋関数と言えるのか。
関数が以下の条件を満たす場合純粋関数と言える。
純粋関数の条件
① 引数が同じの場合、常に同じ値を返す。
② 関数によってプログラムの状態が変化することはない。
以下のコードは純粋関数の例である。
function add(a, b) {
return a + b
}
関数に引数として1, 2を入れると、必ず3を返す関数である。
関数の外部の影響を受けず、想定できる値が保証できる。
しかし、以下の関数はどうだろう。
let num = 2
function add(a) {
return a + num
}
一見純粋関数に見えるが、よく見ると、関数外部の変数を参照していることがわかる。
number型のnum
は、現在2
の状態であるが、これが3
や4
に変更されたら、関数add
が返す値はその都度変わってしまう。
関数が外部の影響を受けて返す値が変わってしまうこのような関数は純粋関数とは言えない。
なぜ純粋関数を使うのか。
純粋関数を使う理由としては以下の通りである。
① テストしやすい。
関数が返す値が想定できるため、テストコードを書くことが簡単になる。
② プログラムの複雑度を下げることができる。
1つの機能を持つ返り値が保証できる関数であるため、自然と得られる結果である。
では以下の例はどうだろう。
function returnFn() {
return function sample () {
console.log("hello world")
}
}
関数を返す関数で、高段関数である。
結論から言うと、このような高段関数も純粋関数に属する。
純粋関数は、外部の影響を受けないという条件があるとのことから、上記のreturnFn関数はこの条件に当てはまることがわかる。