💊
副作用のある関数には気をつけて
副作用のある関数とは
何かしら外部の状態を変更してしまう処理のこと
状態を変更してしまう例
副作用の例
generateMemberId()
で新しい文字列のidを発行したら、lastMemberId
の値が都度変わってしまいます...!
let lastMemberId;
function generateMemberId(memberName) {
id = 'id_' + memberName;
lastMemberId = id;
return id;
}
何で困るの?
-
テストがしづらくなる
「あれさっきまで通ってたじゃん.?なんで今は落ちてるの??」となります。
-
予期しないことが起きる
副作用がなければ他の状態に影響を与える事がありません
逆に副作用があれば、予測が難しくなり不具合などにも繋がります。
どうすればいいのか(WIP)
- 「副作用を起こすコード」と「起こさないコード」を分離する
- 予測できる関数名にする
副作用は悪?
悪ではないです。
パッと思いつくだけでも以下の様な、副作用が起きそうなケースがあります。
- DBの処理
- グローバル変数
どの処理もプログラミングをしてたら、必要になりそうなものばかりです。
よって、”悪”ではなく必要な場面もたくさんあるのは明らかです。
まとめ
副作用をなるべく減らせば、テストがしやすく予期せぬ事が起きないコードになる。
その結果不具合が減り、保守性の高いコードにつながっていく。
しかし副作用を避けられない時もあるので、その時はうまく付き合っていきましょう。
参照
Discussion