前提・実現したいこと
javascriptでクラスのメソッドを書いていますが、どうしても副作用を起こさないメソッドのコーディングが難しいです。
該当のソースコード
以下のようにプライベートメソッドthis._value
を更新するupdateValue
メソッドがあります。
js
1class TestClass { 2 _value = null; 3 4 // this._valueを書き換えるメソッド 5 updateValue(value) { 6 this._value = value; 7 } 8}
このthis._value
を使って計算するメソッドcalcFunc
を追加します
js
1class TestClass { 2 _value = null; 3 4 // this._valueを書き換えるメソッド 5 updateValue(value) { 6 this._value = value; 7 } 8 9 // 計算するメソッド 10 calcFunc(multipliedValue) { 11 return this._value * multipliedValue; 12 } 13}
質問詳細
この場合this._value
の値が変わるとcalcFuncメソッドの結果が変わってしまいます。
これは副作用を起こすメソッドということだと思うのですが、様々なサイトでは「関数の外で定義された変数によって結果が異なるので参照透過性がない」と書かれています。
js
1const test = new TestClass(); 2test.updateValue(2); 3test.calcFunc(3); // 6 4 5test.updateValue(3); 6test.calcFunc(3); // 9
この例のコードが簡単すぎてあまり良くない例かもしれません。
ですが、プライベート変数に値を保持しておいて、メソッドの戻り値がプライベート変数によって変わるのは副作用を起こすのでこれはダメなコーディングでしょうか?
副作用、参照透過性を解説しているサイトはどれも関数について書かれていて、クラスのメソッドについてではない気がしています。
もしメソッドが副作用を起こさないようにするにはプライベート変数を使うべきではないのでは?とも思ってしまいますがプライベート変数を使わないことができません。
どのようにしたらメソッドに副作用を起こさないように書けるのでしょうか?
どうぞ宜しくお願い致します。
回答3件
あなたの回答
tips
プレビュー