纯函数用于状态管理

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

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

希望你已经获得答案了。

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,538评论 1 11
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,140评论 1 32
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,161评论 0 21
  • 本人于2019年5月18日偶然发现网易举办的“产品运营官”养成计划,抱着试一试的态度填写信息申请入营资格,并于5月...
    杂谈木木阅读 359评论 0 0
  • Chapter21相信总有一天,你会明白的 点击上一章回顾 离开他,只因为遇见你 晴朗的天空中飘过几朵的乌云,将火...
    郭沐辰阅读 607评论 1 6