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

时间:2014-08-11 13:21:18

标签: javascript state immutability frp bacon.js

我的问题是关于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)如果不允许,推荐什么?使用尝试的不可变集合?或者一些巨大的重构,所以我根本不需要订单作为我的代码中的现象?

感谢。

1 个答案:

答案 0 :(得分:1)

反应式编程的整个想法不起作用,如果你改变数据或引起预期会引用透明的事物的副作用。

所以1)修改状态不是非法的,但是你可以遇到未定义的行为场景。所以你是独立的。

2)并且由于不建议使用变异,可以选择其他方法:按照您的提及尝试immutable.js,在列表顶部构建优先级队列或者更合适。不要预先判断性能。不可变集合使用共享,因此当您复制集合时,您不需要复制元素,因为它们可以共享(它们也被认为是不可变的 - 为什么要复制我们没有改变的东西)。