【问题标题】:FRP complex state - immutability vs performanceFRP 复杂状态 - 不变性与性能
【发布时间】: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


    【解决方案1】:

    如果你改变数据或在预期是透明的东西中引起副作用,那么反应式编程的整个想法就行不通了。

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

    2) 由于不建议使用突变,还有什么替代方法:尝试immutable.js,正如您提到的那样,使优先级队列建立在 List 之上或更合适的位置。不要预先判断性能。不可变集合使用共享,因此当您复制集合时,您不需要复制元素,因为它们可以共享(它们也被认为是不可变的 - 为什么要复制我们没有更改的内容)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多