【问题标题】:Why are pure reducers so important in redux?为什么纯 reducer 在 redux 中如此重要?
【发布时间】:2017-11-29 17:35:24
【问题描述】:

纯 reducer 没有副作用,可以实现时间旅行等功能。它们使推理应用程序行为变得更容易。

这对我来说很直观。但我无法清楚说明为什么纯 reducer 会导致这些积极的非功能属性。

有人能帮我解释一下为什么让 reducer 无副作用会更容易推理应用程序行为吗?

是因为在运行 reducer 后保证你有完全相同的状态吗?

如果是这样,那么即使是具有副作用的(即非纯)reducer 也肯定具有此属性吗?

【问题讨论】:

  • 这是纯函数的基本属性,是的。不,在相同输入上运行 reducer 后,您不能创建具有完全相同状态的非纯函数。
  • 我认为这个问题可能对 Software Engineering SE 有更好的吸引力。无论如何,据我所知,没有副作用是推理更容易的原因,因为你所需要的只是输入和输出——这是不言而喻的。我不会将此作为答案发布,因为我不确定这种解释对您来说是否是循环推理。

标签: javascript redux pure-function


【解决方案1】:

是因为在运行 reducer 后保证你有完全相同的状态吗?

是的,pure reducer 是 deterministic,这意味着如果给定相同的输入,它们将始终产生相同的结果输出。此属性有助于单元测试等情况,因为您知道如果测试通过一次,它将始终通过。

如果是这样,那么即使是具有副作用的(即非纯)reducer 也肯定具有此属性吗?

不,不纯的 reducer 会同时依赖 inputs 和应用程序的 state。在您测试时,它们可能会以给定的方式运行 1000 次,但当您的应用程序碰巧处于您从未想过要测试的特定状态时,它们就会中断。

当然,完全有可能在单元测试中出现漏掉极端情况的空白。但是,如果测试的结果是 100% 基于 输入,那么您更有可能通过查看 reducer 预期的指定输入来注意到这些极端情况。

如果一个函数改变了应用程序的状态,那么两次运行相同的函数,或者以不同的顺序运行相同的几个函数,可能会导致完全不同的行为。这使得很难推断应用程序的正确性,因为为了知道给定的代码行是否正确,您必须知道在调用它之前发生了什么,可能在应用程序的完全不同的部分。

【讨论】:

  • 啊,将除参数以外的任何内容作为输入处理,而不是改变返回值以外的状态,这样的副作用很大吗?还是两者之一?
  • @BenAston:我没有达到我本来可以做到的精确度。从技术上讲,副作用是关于改变状态,但有一个隐含的假设,如果你有一些函数改变状态,那么你可能也依赖于状态。如果您只更改状态,但没有其他依赖于该状态,那么您的更改将是安全的,但毫无意义。如果您只依赖状态,但您的应用程序的状态从未改变(即“状态”是恒定的)。
【解决方案2】:

是不是因为保证之后你有完全相同的状态 运行减速器?

是的,这就是使纯减速器成为“黄金标准”的原因。如果输出只依赖于输入,那么就很容易测试、回放、保存历史等等……

如果是这样,那么即使是有副作用的(即非纯的)reducer 也肯定会有 这个属性?

(不是流行的答案)。这也是正确的。如果您小心的话,非纯减速器也可能具有这些相同的属性。但是,它更容易出错,并且(从概念上)没有多大意义。 (我认为)你得到的想法是一切都只是输入和输出。您可以稍微改变一下思路,将“非纯”reducer 的内部状态视为对 reducer 的又一个输入。

从这个意义上说,您可以想象跟踪您的应用程序状态、您的操作和减速器的内部状态,并最终获得与纯减速器相同的播放等属性(尽管您需要更多代码来处理)。

但是,问题来了:现在您有了实际的应用程序状态和 reducer 的内部(和隐藏)状态。谁想跟踪两组状态?这就是真正使测试、推理和实施变得更加困难的原因。有更多“种类”的事情需要跟踪,并且更容易错过/忘记关键细节。从本质上讲,如果您的应用程序已经有很大一部分专门用于跟踪状态,那么您为什么想要将更多状态隐藏在 reducer 中?

因此,即使为了“正确”而忽略做正确的事情,从概念上讲,对于您的整个系统架构而言,将所有状态都保存在一个地方在概念上更简单。

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 2019-11-22
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2017-09-24
    相关资源
    最近更新 更多