データ ツリーをデータ バックエンドとして持つアプリケーションがあります。MVVM パターンを実装するために、データ ツリーをカプセル化するクラスのロジック レイヤーがあります。したがって、ロジックもツリーに配置されます。入力が有効な状態にある場合、データは、最後の有効な状態のダブル バッファーとして機能する 2 番目のスレッドにコピーする必要があります。したがって、1 つの方法はクローン作成です。
もう 1 つのアプローチは、完全なデータ バックエンドを不変に実装することです。これは、何か新しいものが入力された場合、データ ツリー全体を再構築することを意味します。私の質問は、これを行う実用的な方法はありますか? データ ツリーをロジック レイヤーに効率的に再割り当てする必要があるところで行き詰まっています。
**更新 - いくつかのコード
私たちが行っていることは、実験を実行するために使用するハードウェア デバイスを抽象化することです。そのため、「シャーシ、シーケンス、カード、チャネル、ステップ」などのクラスを定義しました。それらは次のようなツリー構造を構築します。
Chassis
/ \
Sequence1 Sequence2
/ | \
Card1 Card2 Card3
/ \
Channel1 Channel2
/ \
Step1 Step2
コードでは次のようになります。
public class Chassis{
readonly var List<Sequence> Sequences = new List<Sequence>();
}
public class Sequence{
readonly var List<Card> Cards = new List<Card>();
}
等々。もちろん、各クラスにはさらにいくつかのプロパティがありますが、それらは簡単に処理できます。私の問題は、 List が変更可能なオブジェクトであることです。List.Add() を呼び出すと、変更されました。わかりました ReadOnlyList がありますが、不変性が正しい方法で実装されているかどうかはわかりません。参照ではなく値によるコピーと同じように、set メソッドをブロックして書き込みをブロックするだけではありません。次の問題は、シーケンスとステップの量が変動する可能性があることです。このため、リスト要素のアトミック交換が必要です。現時点では、この方法が役立つかどうか、妥当な時間内に実装できるかどうかをまだ考えているため、これ以上のコードはありません。