【发布时间】:2014-08-11 13:21:17
【问题描述】:
我的问题是关于 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,但是,首先,没有不可变的优先级队列(如果有意义的话),其次,我担心这样的集合的性能会很差。
所以,最后,我的问题有 2 个部分:
1) 在 HEAVY STATE 的情况下,修改 .withStateMachine 中的状态是否合法? 它会在 bacon.js 内部产生一些非常非常糟糕的副作用吗?
2) 如果不允许,有什么建议?使用尝试的不可变集合?或者进行一些巨大的重构,这样我的代码中根本不需要订单簿作为现象?
谢谢。
【问题讨论】:
标签: javascript state immutability frp bacon.js