787 文字
4 分
サイドエフェクトを持つ関数とは?
サイドエフェクトを持つ関数とは、関数自身が返す値以外の状態を変化させる関数を指します。具体的には、以下のいずれかに該当する関数です。
- グローバル変数や静的変数を変更する関数
- ファイル入出力を行う関数
- DOM を操作する関数
- 状態変数を更新する関数
これらの関数は、呼び出すたびに状態が変化するため、テストやデバッグが困難になることがあります。また、意図しない副作用が発生する可能性もあります。
例
// グローバル変数を変更する関数function add(x, y) { globalVar += x + y;}
// ファイル入出力を行う関数function readFile(path) { const data = fs.readFileSync(path); return data;}
// DOM を操作する関数function changeColor(element) { element.style.color = "red";}
// 状態変数を更新する関数function updateState(state) { state.count++;}
上記のコード例では、
add
関数はグローバル変数globalVar
を変更します。readFile
関数はファイルを読み込み、その内容を返します。changeColor
関数は DOM 要素の色を変更します。updateState
関数は状態変数state
のcount
プロパティを更新します。
これらの関数はすべて、副作用を持っています。
サイドエフェクトを持つ関数の注意点
サイドエフェクトを持つ関数を使用する場合は、以下の点に注意する必要があります。
- テストやデバッグが困難になる
- 意図しない副作用が発生する可能性がある
- コードの理解が難しくなる
副作用を持つ関数は、必要最低限に留め、純粋関数と組み合わせることで、コードの品質を向上させることができます。
純粋関数
純粋関数とは、副作用を持たず、入力値のみを元に決定的出力を返す関数です。純粋関数は、テストやデバッグが容易で、意図しない副作用が発生する可能性がないという利点があります。
例
// 純粋関数function add(x, y) { return x + y;}
// 純粋関数function filter(array, predicate) { return array.filter(predicate);}
上記のコード例では、
add
関数は入力値x
とy
を元に、常に同じ出力を返します。filter
関数は入力値array
とpredicate
を元に、常に同じ出力を返します。
これらの関数はどちらも、純粋関数です。
まとめ
サイドエフェクトを持つ関数とは、関数自身が返す値以外の状態を変化させる関数です。サイドエフェクトを持つ関数を使用する場合は、テストやデバッグが困難になる、意図しない副作用が発生する可能性がある、コードの理解が難しくなるなどの点に注意する必要があります。副作用を持つ関数は、必要最低限に留め、純粋関数と組み合わせることで、コードの品質を向上させることができます。