副作用と参照透過性

副作用

副作用とは「ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。」とある。要件は以下である。

  • 副作用を受ける処理には、暗黙に参照している変数がある
  • 副作用を与える処理には、暗黙に代入している変数がある

暗黙に値を参照する処理の出力は想定外のものになる。そのため機能は意図していない結果を出力する。

参照透過性

参照透過性とは「式の値はその構成要素(例えば変数や関数)によってのみ定まるということを言う。具体的には変数の値は最初に定義した値と常に同じであり、関数は同じ変数を引数として与えられれば同じ値を返すということになる。とある。要件は以下である。

  • 同じ条件を与えれば必ず同じ結果が得られる
  • 他のいかなる機能の結果にも影響を与えない

参照透過性のある処理の出力は想定内となる。そのため機能は意図した結果を出力する。

機能に欠陥が無いことは入力に対し、意図した出力となっている事で確認できる。つまり、副作用がある構造となっているものはその確認ができない。であるが、実際には暗黙に参照している変数も処理に必要なものである。つまり暗黙に参照している変数も想定内として意図した出力となることを確認すればよい。

しかしながら、暗黙に参照している変数を想定内にしていくことは容易ではない。グローバル、モジュール変数は共有のしやすさから大変便利であり、利用しているソフトウェアは多い。これらは暗黙となり易く、機能追加により肥大化しやすい。

参照透過性を制約として導入している言語は多数あるが、保守すべきソフトウェアはそうでない場合が多いだろう。だから暗黙とならない様に工夫をしていく必要がある。例えばグローバル、モジュール変数は直接参照せず関数の戻り値として受け取る。これにより関数の差し替えを行うことで意図した入出力が行えているか確認することができる。

参考文献

コメントを残す