我试图让我的头绕着我的第一个Redux(NGRX/Store)项目的不变性。避免状态变异已经证明是非常痛苦的,在与Object.assign({})和状态变异错误作斗争之后,我发现了Immutable.JS。这使事情变得更容易。Redux/ImmutableJS嵌套状态+ Big-o不可变集合的复杂性
可以说我有一个金融交易应用程序,它需要在加载时在图表上显示一个酒吧集合。每秒钟几次,最后一根酒吧需要根据实时价格信息进行更新,而且每隔一段时间都会增加一个新酒吧。
这一切都需要为{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实际发生的事情。我是否将整个数组或地图中的每个项目都复制到一个全新的数组/地图中 - 每次我需要在不可变集合中更改某些内容时?或者我只是改变一个参考或其他东西?
我希望有一些关于Big-Oh不可变集合的复杂性的发布信息,它可以很容易理解这些东西将如何执行,但我无法在任何地方找到它。