我正在尝试为我的第一个 Redux (NGRX/Store) 项目了解 Immutability。避免状态突变被证明是非常痛苦的,在与 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 引擎盖下实际发生了什么。我是否将整个数组中的每一项都复制或映射到一个全新的数组/映射中 - 每次我需要更改不可变集合中的某些内容时?还是我只是在更改参考或其他内容?
我希望有一些关于不可变集合的 Big-Oh Complexity 的已发布信息,这样可以很容易地理解这些东西将如何执行,但我在任何地方都找不到。