gpt4 book ai didi

javascript - FRP 复杂状态 - 不变性与性能

转载 作者:行者123 更新时间:2023-11-28 01:04:21 29 4
gpt4 key购买 nike

我的问题是关于 FRP 中“状态机”对象的可变性。我正在评估Bacon.js's Observable.withStateMachine .

我的领域是交易机器人。我有一个“订单”的源事件流,它实际上是元组(买入或卖出,价格,数量)

我想使用类似下面的伪代码````

 orders.withStateMachine(new Book(), function(book,order) { // is 'book' mutable ?!!
var bookModifiedEvents = book.merge(order);
return [book, modifications];
})

Book.prototype.merge = function(order) {
// either append order into the Book, or generate Trade when order gets filled.
// generate corresponding bookModifiedEvents and tradeEvents.
return bookModifiedEvents.merge(tradeEvents);
}

```

此代码应将交易订单聚合到订单簿(这是一对按价格排序的买价和卖价订单的优先级队列)并发布“bookModified”和“tradeOccured”事件流。

我不太明白的是:我可以直接修改传递给我给 .withStateMachine 方法的回调的初始状态对象吗?

由于 FRP 是关于不变性的,所以我认为我不应该这样做。在这种情况下,我应该创建很多订单簿对象,这些对象非常重(里面有数千个订单)。

所以我开始寻找immutable collections ,但是,首先,没有不可变的优先级队列(如果有意义的话),其次,我担心此类集合的性能会很差。

所以,最后,我的问题有两部分:

1) 在 HEAVY STATE 的情况下,修改 .withStateMachine 中的状态是否合法?它会对 bacon.js 内部产生一些非常非常糟糕的副作用吗?

2)如果不允许,建议什么?使用尝试的不可变集合?或者进行一些巨大的重构,这样我就不再需要订单簿作为我的代码中的现象?

谢谢。

最佳答案

如果您改变数据或在预期引用透明的内容中产生副作用,则响应式(Reactive)编程的整个想法将不起作用。

因此 1) 修改状态并不违法,但您可能会遇到未定义的行为场景。所以你只能靠自己了。

2)由于不建议进行突变,有什么替代方案:尝试您提到的 immutable.js ,将优先级队列构建在 List 之上或其他更合适的方式。不要预先判断表现。不可变集合使用共享,因此当您复制集合时,您不需要复制元素,因为它们可以共享(它们也被假定为不可变 - 为什么要复制我们不更改的内容)。

关于javascript - FRP 复杂状态 - 不变性与性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244296/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com