あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

副作用

関数型プログラミングでは「メソッドはどんな副作用(side effect)も持ってはならない」 *1 *2
という発想があります。
仕事でも、副作用がないプログラミングはバグを減らせる御利益があると思って
java のプログラムで複数のオブジェクトが参照する Map や List はなるべく
ImmutableMap, ImmutableList を使用したり final 指定した方がよいと
思われるところは積極的につけたりしています。
Scala も副作用のないプログラミングが推奨されていますが、
再度、その理由(メリット)をざっくりと確認してみました。

副作用とは何?

  1. 状態(変数、インスタンス変数)の変更があること
  2. 状態変更がその後の処理に影響をあたえること

副作用の何が問題?

  • 同じオブジェクトを複数の(参照型)変数から参照している場合、違う場所の処理でみんなが参照しているオブジェクトの内容を変更すると、他の処理に予期せぬ影響を与えてバグの原因となる可能性が高い。
  • 複数のオブジェクトが密に関連し合ってる場合はプログラムの見通しが悪くなる場合が多い。(処理を推測し辛い) *3

でも副作用を全く無くす事は現実的に難しい

  • 副作用による影響を局所化することで他からの参照を避ける。

副作用のない関数(メソッド)のメリット

  • 同じ引数で何度呼び出しても同じ結果が得られる。
  • オブジェクトや関数の独立度が上がり、見通しが良くなる。
  • 結果、予期せぬ影響によるバグを減らす事ができる。

*1:コップ本から引用

*2:なんという縛り

*3:プログラムの作り方に問題がある場合も多い