💊

副作用のある関数には気をつけて

2023/01/06に公開

副作用のある関数とは

何かしら外部の状態を変更してしまう処理のこと

状態を変更してしまう例

副作用の例
generateMemberId()で新しい文字列のidを発行したら、lastMemberIdの値が都度変わってしまいます...!

let lastMemberId;

function generateMemberId(memberName) {
  id = 'id_' + memberName;
  lastMemberId  = id;
  return id;
}

何で困るの?

  1. テストがしづらくなる

    「あれさっきまで通ってたじゃん.?なんで今は落ちてるの??」となります。

  2. 予期しないことが起きる
    副作用がなければ他の状態に影響を与える事がありません
    逆に副作用があれば、予測が難しくなり不具合などにも繋がります。

どうすればいいのか(WIP)

  • 「副作用を起こすコード」と「起こさないコード」を分離する
  • 予測できる関数名にする

副作用は悪?

悪ではないです。

パッと思いつくだけでも以下の様な、副作用が起きそうなケースがあります。

  • DBの処理
  • グローバル変数

どの処理もプログラミングをしてたら、必要になりそうなものばかりです。
よって、”悪”ではなく必要な場面もたくさんあるのは明らかです。

まとめ

副作用をなるべく減らせば、テストがしやすく予期せぬ事が起きないコードになる。
その結果不具合が減り、保守性の高いコードにつながっていく。

しかし副作用を避けられない時もあるので、その時はうまく付き合っていきましょう。

参照

https://jisou-programmer.beproud.jp/関数設計/4-副作用のない関数にまとめる.html

Discussion