我们用一个足够简单的例子来演示,如何用 纯函数 做状态管理:
typealias State = Int
enum Event {
case increase
case decrease
}
func reduce(_ state: State, event: Event) -> State {
switch event {
case .increase:
return state + 1
case .decrease:
return state - 1
}
这个例子似乎过于简单,以至于我们看不出他有什么特别的。好吧,我承认他的主要目的是向大家演示,用 纯函数 做状态管理的基本单元是什么。
首先,我们得有个状态:
typealias State = Int
然后,我们要有各种事件:
enum Event {
case increase
case decrease
}
最后,我们要有一个 纯函数 来管理我们的状态:
func reduce(_ state: State, event: Event) -> State {
switch event {
case .increase:
return state + 1
case .decrease:
return state - 1
}
}
这样,我们就可以做测试了,当 App 处于某个状态时,发生了某个事件,会产生一个结果,这个结果是否符合我们的预期:
func testReduce() {
let state1 = reduce(0, event: .increase)
state1 == 1 // 结果:true 😎
let state2 = reduce(10, event: .decrease)
state2 == 9 // 结果:true 😎
}
以上两个测试都是成功的。当然这里的状态管理过于简单。而真实应用程序的状态都是非常复杂的。并且程序的行为都是很难预测的。要解决这个问题,我们要感谢 纯函数,还记得他的特征吗?
1.没有附加作用,2.纯函数在参数相同时,返回值也一定相同。
我们再来看下 reduce 方法:
func reduce(_ state: State, event: Event) -> State { ... }
我们有没有获得一点点灵感...
...
...
...
...
...
... 经过 60 秒后
希望你已经获得答案了。
当程序处于某个特定状态时,发生了某个特定事件,会产生某个唯一的结果。这个结果与所处的环境无关,不论是处于应用程序运行环境,还是在测试环境。这个结果只和初始状态以及发生的事件有关。因此,程序的行为是可以被预测的,而且程序运行时的状态更新,可以在测试环境中被模拟出来。