プログラミングにおける副作用とは?
- 関数またはメソッドを実行した時に、オブジェクトの属性が変化すること
- 例)メソッドのスコープ外の変数の値を変更している
- この場合、時間とともに変数の値が変化し続ける → 毎回違う結果になる可能性が高い
- 例)メソッドのスコープ外の変数の値を変更している
- 予期せぬエラーを発生させるリスクとなる - どこに影響があるか都度調査しなければならない
- 副作用を防ぐには**参照透過性**を担保する必要がある - 参照透過性 = 同じ条件を与えれば必ず同じ結果が得られる - 他の機能に影響を与えない
副作用のコード例
// 副作用の例
// Add を実行するたびに得られる結果が変わってしまう
int a = 1;
public int Add(int b)
{
a = a + b;
return a;
}
コマンド・クエリ分離の原則(CQS)
- 副作用を最小限に抑える設計原則
- メソッドがオブジェクトの状態を変更するのであれば、そのメソッドはコマンド
- 値を返してはいけない
- メソッドが何らかの値を返すのであれば、そのメソッドはクエリ
- オブジェクトの状態を変更してはいけない
- 状態を変更するメソッドと変更しないメソッドを明確に分ける → 非常に扱いやすくなる
- 副作用によるリスクを局所化する
参考文献