クラス 1 の 1 つのオブジェクトとクラス 2 のオブジェクトのシーケンスの 2 つのメンバーを持つレコードとしていくつかの状態を保持するシミュレーターがあります。
シミュレーションが実行されると、入力が読み取られ、入力に応じて、それらのオブジェクトのいくつかのメソッドが呼び出されます。このようなメソッドは、内部状態を変更します。
私は F# を学んでおり、不変データの重要性を理解しています。ただし、そのような状態の複雑さ (ここで公開したものよりもはるかに多い) を考えると、そのようなオブジェクトに内部可変状態を持たせることは大したことではないと思います。少なくともそれは隠されています。
ただし、問題はもう 1 つあります。そして、それはおそらく単純です。
反復の間に、「1 つ」および「多数」のオブジェクトへの変更が失われます。
InvokeMethodOn (明らかに単純化されています) は、これらのオブジェクトのコピーを取ると思います。
ここである種の参照が必要なことはわかっていますが...ここで少し迷っています...状態には参照メンバーが必要ですか? InvokeMethodOn は ref で渡す必要がありますか? それらのすべて?そして、「多くの」シーケンスはどうですか?
編集:何百万もの「多くの」オブジェクトが存在する可能性があります。それらのそれぞれには、1 または 2 KB の状態があります (現時点では、バイトの塊に保持されています)。
編集:「多く」を配列に変更する(および提案されているようにArray.iterを使用する)と、問題が修正されました。みんなに感謝!
type State = {
one : Class1
many : Class2 seq
}
type Simulator() = class
member x.run(state : State) =
// ....
while ...
let input = ReadInput
if someFuncOf(input)
then InvokeMethodOn(state.one, input)
else Seq.iter (fun x -> InvokeMethodOn(x, input)) state.many
member x.InvokeMethodOn obj input =
obj.ChangeInternalState input