純粋関数と副作用 | 関数型プログラミングの基礎 | JavaScript 超完全入門 基本から発展までのすべて

スポンサーリンク
スポンサーリンク

純粋関数とは?

関数型プログラミングにおいて、純粋関数(Pure Function)とは、入力に対して必ず同じ出力を返し、外部状態に影響を与えない関数のことを指します。純粋関数は外部の変数や状態に依存せず、関数の内部で状態を変更することもありません。

純粋関数の特徴

純粋関数には以下の特徴があります。

特徴 説明
入力が決まれば出力も常に一定 同じ引数を与えれば、常に同じ結果が返される。
副作用がない 外部の変数や状態を変更せず、外部からの影響も受けない。

純粋関数の例

以下は、純粋関数の例です。この関数は、入力された2つの数値を足し合わせ、外部状態に影響を与えずに結果を返します。

function add(a, b) {
    return a + b;
}

console.log(add(2, 3));  // 出力: 5

このadd関数は、入力が同じであれば常に同じ出力(5)を返します。外部の状態に影響を与えることも、外部の状態に依存することもありません。

副作用とは?

一方、副作用(Side Effect)とは、関数が外部の状態を変更したり、外部の状態に依存したりする現象のことです。副作用を持つ関数は、同じ入力に対して異なる結果を返す可能性があり、予測が難しくなることがあります。

副作用を持つ関数の例

次に、副作用を持つ関数の例を示します。この関数は、グローバル変数を変更しています。

let count = 0;

function increment() {
    count++;
}

increment();
console.log(count);  // 出力: 1

このincrement関数は、副作用としてグローバル変数countを変更しています。呼び出されるたびにcountの値が変わり、同じ入力に対して異なる出力が返されることがあります。

純粋関数と副作用の比較

純粋関数と副作用を持つ関数の違いを以下の表にまとめます。

比較項目 純粋関数 副作用を持つ関数
外部状態への影響 なし あり
出力の一貫性 入力が同じであれば、常に同じ出力を返す 外部状態に依存するため、同じ入力でも異なる結果を返す可能性がある
デバッグの難易度 低い(出力が予測可能) 高い(外部状態に依存し、予測が難しい)

副作用を避ける理由

副作用を持つ関数は、デバッグやテストが難しく、コードの挙動が予測しにくくなります。特に大規模なアプリケーションでは、予測不能な副作用が原因で不具合が発生する可能性が高くなります。そのため、関数型プログラミングでは副作用を避け、できるだけ純粋関数を使用することが推奨されます。

副作用を回避する例

次に、副作用を持たない形で変数を管理する方法の例を示します。

function incrementPure(count) {
    return count + 1;
}

let result = incrementPure(0);
console.log(result);  // 出力: 1

この例では、グローバル変数を変更する代わりに、新しい値を返しています。これにより、副作用を避けつつ、データを更新することができます。

まとめ

関数型プログラミングでは、純粋関数と副作用のないコードを書くことが重要です。純粋関数は入力に対して常に同じ出力を返し、外部状態に依存しないため、予測可能でデバッグがしやすいコードになります。一方、副作用を持つ関数は、外部状態を変更するため、動作が予測しにくくなります。副作用を避け、純粋関数を意識してコーディングすることで、保守性の高いコードを実現できます。