纯reducers没有副作用,可以实现时间旅行等功能。它们使得应用程序行为的推理更加容易。
这对我来说很直观,但我无法表达为什么纯reducers会带来这些积极的非功能属性。
有人能帮我表达一下,为什么让reducers无副作用会使得应用程序行为的推理更加容易吗?
是因为在运行reducers之后,保证了具有相同的状态吗?
如果是这样,那么即使是具有副作用的(即非纯)reducers也可能具有这个特性吗?
纯reducers没有副作用,可以实现时间旅行等功能。它们使得应用程序行为的推理更加容易。
这对我来说很直观,但我无法表达为什么纯reducers会带来这些积极的非功能属性。
有人能帮我表达一下,为什么让reducers无副作用会使得应用程序行为的推理更加容易吗?
是因为在运行reducers之后,保证了具有相同的状态吗?
如果是这样,那么即使是具有副作用的(即非纯)reducers也可能具有这个特性吗?
这是因为运行 reducer 后保证状态完全相同吗?
是的,纯函数的 reducers 是 确定性的,这意味着如果它们得到相同的输入,它们将始终产生相同的输出结果。这个特性有助于像单元测试这样的情况,因为你知道如果一次测试通过,它总是会通过。
如果是这样,那么即使是具有副作用(即非纯函数)的 reducers 也可以具有这个属性吗?
不,非纯 reducers 将依赖于应用程序的 输入 和 状态。虽然在测试时它们可能会以某种方式行为1000次,但在你从未想过测试的特定状态下,它们可能会出现故障。
当然,测试单元中可能会有一个遗漏的角落案例。但如果测试结果完全基于输入,那么只需查看 reducer 所期望的指定输入,就更有可能注意到这些角落案例。
如果一个函数改变了应用程序的状态,那么两次运行同一个函数,或者以不同的顺序运行相同的几个函数,可能会导致完全不同的行为。这使得很难推断应用程序的正确性,因为为了知道某一行代码是否正确,你必须知道在调用它之前发生了什么事情,可能是应用程序完全不同的部分。