我的问题是关于FRP中“状态机”对象的可变性。我正在评估Bacon.js's Observable.withStateMachine。
我的域名正在交易机器人。我有一个'Orders'源事件流,实际上是元组(买入或卖出,价格,交易量)
我想使用类似下面的伪代码 ```
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,但是,首先,没有不可变的优先级队列(如果有意义的话),其次,我担心这些集合的性能会很差。 / p>
所以,最后,我的问题有两个部分:
1)在HEAVY STATE的情况下,修改.withStateMachine中的状态是否合法? 在bacon.js内部会有一些非常非常糟糕的副作用吗?
2)如果不允许,推荐什么?使用尝试的不可变集合?或者一些巨大的重构,所以我根本不需要订单作为我的代码中的现象?
感谢。
答案 0 :(得分:1)
反应式编程的整个想法不起作用,如果你改变数据或引起预期会引用透明的事物的副作用。
所以1)修改状态不是非法的,但是你可以遇到未定义的行为场景。所以你是独立的。
2)并且由于不建议使用变异,可以选择其他方法:按照您的提及尝试immutable.js
,在列表顶部构建优先级队列或者更合适。不要预先判断性能。不可变集合使用共享,因此当您复制集合时,您不需要复制元素,因为它们可以共享(它们也被认为是不可变的 - 为什么要复制我们没有改变的东西)。