最初の Redux (NGRX/Store) プロジェクトの不変性について頭を悩ませようとしています。状態の変更を回避することは非常に困難であることがわかりました。Object.assign({}) と状態の変更エラーと戦った後、Immutable.JS を発見しました。これにより、物事がはるかに簡単になります。
私が金融取引アプリケーションを持っているとしましょう。ロード時にチャートにバーのコレクションを表示する必要があります。毎秒数回、ライブ価格情報に基づいて最後のバーを更新する必要があり、そのたびに新しいバーが追加されます。
そして、これはすべて {1-n} 金融商品 (EURUSD/GBPJPY/Gold/Oil など) に対して発生する必要があります。だから私は私のアプリのこの部分のためにこのモデルを思いつきました:
export interface CandleState {
LastCompletedCandle : Candle;
InProgressCandle : Candle;
LastTick:Offer;
ClosedCandles:immutable.List<Candle>;
};
export interface AllCandleState {
instruments: immutable.Map<string, CandleState>
}
不変リストを含む不変マップがあることに気付くでしょう。したがって、私の最初の質問は次のとおりです。このように「不変性内の不変性」を行うことに何か意味はありますか? 電話してから
instruments.set("EURUSD", { [my new state] })
まったく新しい状態を効果的に返すため、このように不変性をネストする必要があるかどうかはわかりません.... ClosedCandlesリストの変更を購読できるようにしたいです。これを不変にすることで、変更を直接観察できるようになりますか? または、これらは「トップ」レベルからのみ検出されます。
私の次の質問は、これについてまったく心配する必要があるかどうかです。不変のコレクションを変更することは非常にコストのかかる操作であることが頭に浮かびました。list.push または map.set を実行すると、内部で実際に何が起こっているかがわかります。不変コレクションで何かを変更する必要があるたびに、配列全体またはマップ内のすべてのアイテムを新しい配列/マップに 1 つずつコピーしていますか? それとも、参照か何かを変更しているだけですか?
これらがどのように実行されるかを簡単に理解できるように、不変コレクションの Big-Oh Complexity に関する公開情報があればいいのですが、どこにも見つかりません。