美文网首页
纯函数用于状态管理

纯函数用于状态管理

作者: 来金德瑞 | 来源:发表于2019-08-27 15:48 被阅读0次

    我们用一个足够简单的例子来演示,如何用 纯函数 做状态管理:

    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 秒后

    希望你已经获得答案了。

    当程序处于某个特定状态时,发生了某个特定事件,会产生某个唯一的结果。这个结果与所处的环境无关,不论是处于应用程序运行环境,还是在测试环境。这个结果只和初始状态以及发生的事件有关。因此,程序的行为是可以被预测的,而且程序运行时的状态更新,可以在测试环境中被模拟出来。

    相关文章

      网友评论

          本文标题:纯函数用于状态管理

          本文链接:https://www.haomeiwen.com/subject/lepeectx.html