JavaScriptの純粋関数(pure function)と副作用の違いを理解しよう
生徒
「先生、JavaScriptで『純粋関数』って何ですか?あと『副作用』って言葉もよく聞くのですが、どう違うんですか?」
先生
「いい質問ですね。純粋関数とは、決まった入力に対して必ず同じ結果を返し、プログラムの外に影響を与えない関数のことです。一方、副作用はその関数が外の世界に変化を与えることを指します。」
生徒
「もう少しわかりやすい例えとか、具体的な違いを教えてください!」
先生
「もちろんです。実際のコードも交えてゆっくり説明しますね。」
1. 純粋関数(pure function)とは?
純粋関数とは、次の2つのルールを守る関数のことです。
- 同じ入力には必ず同じ結果を返す
- 関数の外側の状態を変えたり、影響を与えたりしない
このルールを守ることで、関数の動きが予測しやすくなり、バグを減らしやすくなります。
例を見てみましょう。
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5(何度呼んでも結果は同じ)
このadd関数は純粋関数です。2と3を渡せば必ず5を返し、外の世界には影響を与えません。
2. 副作用(side effect)とは?
副作用とは、関数が外の世界に何か影響を与えることです。例えば、画面に文字を表示したり、ファイルを書き換えたり、変数の値を変更したりすることです。
副作用のある関数は同じ入力でも結果が変わったり、プログラムの状態を変えたりします。
例を見てみましょう。
let counter = 0;
function increment() {
counter = counter + 1; // 外の変数を変えているので副作用がある
console.log("カウンターは " + counter);
}
increment(); // カウンターは 1
increment(); // カウンターは 2
このincrement関数は副作用があります。関数を呼ぶたびに外のcounter変数の値が変わるからです。
3. 純粋関数と副作用の違いを簡単な例えで説明
純粋関数は「いつも同じ味のクッキーを作るレシピ」です。材料(入力)が同じなら必ず同じクッキー(結果)ができます。
副作用のある関数は「クッキーを作ると同時に、キッチンのテーブルも散らかすレシピ」です。クッキーは作れるけど、キッチンの状態も変わります。
プログラムでは、副作用があると予測が難しくなり、問題が起こりやすいです。
4. 純粋関数のメリット
- 結果が予測しやすい
- バグが少なく、テストもしやすい
- 関数を安全に再利用できる
プログラムをわかりやすく保つために、できるだけ純粋関数を使うことが推奨されます。
5. 副作用のある関数を使う場合の注意点
副作用は完全に悪いわけではありません。例えば、画面に表示したり、ファイルを保存したりするには副作用が必要です。
ただし、副作用を起こす関数はプログラムのどこで使われているかをよく理解し、管理することが大切です。
6. 純粋関数と副作用を意識したコード例
純粋関数で計算だけを行い、副作用は別の関数で行う例です。
// 純粋関数
function multiply(a, b) {
return a * b;
}
// 副作用のある関数
function showResult(result) {
console.log("計算結果は " + result);
}
// 使い方
const result = multiply(5, 3);
showResult(result);
計算は純粋関数で行い、画面表示は副作用のある関数で分けることで、プログラムが整理しやすくなります。