たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

プログラミングにおける副作用

副作用(プログラミング)== 定められた範囲の外側に対して「値渡し」以外の作用を与えること.

関数の副作用: 関数外に対し、値を渡す以外の何かをすること.

副作用の問題点

副作用を意識して呼び出しをおこなわなければいけなくなる.
「この関数を呼び出しても世界は破滅しないのか?」
「この関数を呼び出したら本番サーバーのユーザーデータを変更しちゃわないか?」

副作用less

値を返す以外何もしないことが保証される.
返ってきた値を捨てれば外部への影響がないことが保証できる.
だから何度呼び出しても安全.

安全に何度も呼べる (re-play可)
-> 開発/デバッグ
-> テスト
-> リプレイ

範囲「内」なら値渡し以外をしていい

/*
 * 3倍する.
 */
function pure3times(a: number): number {
  let output = 0;
  for (let i = 1; i <= 3; i++) {
    output = output + a;
  }
  return output;
}

const i = 3;
const o = pure3times(i);
console.log(`${i}, ${o}`);
// > 3, 9

世界にはioしかなくて、pure3timesしてもiが変わっていないのでpure3timesは副作用無し1.
でもpure3timesの中ではoutputの書き換えをしてる.
"関数の副作用"は関数外という範囲に対して副作用を持つかどうかという話.

参考: STモナド


  1. console.logは見なかったことにして.