- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是关于 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/
我是一名优秀的程序员,十分优秀!