値型のオブジェクトでは乱数ジェネレータを使用する必要がありますが、その依存関係の負担は必要ありません
私は現在、Gene
と呼ばれる不変型を持っています。これは2つのフィールドしか持っていません。
double value;
Interval intervalOfAllowedValues;
Gene
スイッチをその範囲内にある限り他の値にランダムに切り替える必要があるintervalOfAllowedValues
で
私はこのために、INumberGenerator.GenerateDouble(...)
を使って状況を管理する特別な方法
public Gene RandomMutation() { ... }
//it returns a Gene because this class is immutable!
を作成しました。問題は、RandomMutation()
が引数としてIRandomNumberGenerator
を受け入れるか、またはGene
がコンストラクタ注入によって1つを取らなければならないことです。
RandomMutation()
どちらの解も好きではない:
RandomMutation()
が引数で数値ジェネレータを受け入れるならば、Gene
はINumberGenenerator
について知っているだけでなく、それを含むクラスも知っている必要があるということを意味する。
一方、コンストラクタインジェクションでINumberGenerator
をこのGene
に渡すと、ほとんどの場合、私はそれを使用せずにそこに持っていきます。私は、このGene
オブジェクトを値型として持つという目的を少し破ると感じています。 2つの異なるGene
が異なる数のジェネレータを持っているかどうかの微妙な問題も提起されています。はいの場合、それをユニットテストする方法は?
第3の選択肢があります:Gene
クラスからRandomMutation()
を離します。今の問題は、Gene
を含むクラスがGene
とInterval
の両方を知る必要があることです。これは望ましくないかもしれません。また、行動はそのデータの近くにあるべきであり、このアプローチに従うときにはそうではないだろう。
数値生成器をグローバル(シングルトン)にするというアプローチはまだ4番目(!)です。それは不思議に過ぎませんが、あらゆる依存関係を明示的にする哲学に反するでしょう。
どうやってこのような状況に対処しましたか?
ありがとう