考虑以下状态机:
class AudioRecorder {
private var currentState = Idle
def buttonTapped() = currentState match {
case Idle =>
currentState = Recording
// start recording...
case Recording =>
currentState = Stopped
// stop recording...
}
}
它有效,但有状态和丑陋。
不幸的是,我有很多情况需要使用连续事件来处理这种状态机,尤其是在UI设置中。
似乎State Monad
是解决这个问题的方法,但到目前为止,通过我的学习,它只有在您可以预先布置状态事件的所有序列时才有用,这样您就可以通过flatMap
将它们全部连接起来,但是当状态事件是连续的并且不确定时(如果用户点击时)则不是这样 - 但如果我错了,请纠正我。
虽然我不太确定我是否在问正确的问题但是,
是否有更好的方法来模拟这种状态机,它可以通过连续和更改来改变其行为。非确定性事件?
我使用akka在服务器端使用 Actor Model 对其进行了建模,但我还没有看到任何人在UI设置中使用actor模型。
同样值得注意的是,AudioRecorder
无法在每个buttonTapped
事件上重新创建以返回新实例(这可能会导致状态问题消失),因为它保留了许多其他状态太昂贵了,无法在每个信号上重新创建。
答案 0 :(得分:0)
将FRP与rxscala
一起使用,您可以封装可变对象并隐藏它。
它可能如下所示(未编译的代码):
class FrpRecorder(button: Observable[Unit]) {
private val recorder = new AudioRecorder
button.subscribe(_ => recorder.buttonTapped())
val recordingLength: Observable[Double] =
interval("100ms").map(_ => recorder.recordingLength)
}