Pure Redurs没有副作用,可以实现时间旅行等。他们更容易推理应用程序行为。
这对我来说很直观。但我无法明确说明为什么纯粹的减速器会导致这些积极的非功能性属性。
有人可以帮助我明确说明为什么让减压器副作用免费使得对应用程序行为的推理更容易吗?
是否因为在运行Reducer后保证具有完全相同的状态?
如果是这样,那么即使是有效的(即非纯粹的)减速器也可以拥有这种属性吗?
答案 0 :(得分:4)
是否因为在运行Reducer后保证具有完全相同的状态?
是的,纯缩减器是确定性,这意味着如果它们被赋予相同的输入,它们将始终产生相同的结果输出。此属性有助于单元测试等情况,因为您知道测试是否通过一次,它将始终通过。
如果是这样,那么即使是有效的(即非纯粹的)减速器也可以拥有这种属性吗?
不,不纯的Reducer会依赖于输入和应用程序的状态。在测试时,它们可以以给定的方式运行1000次,但是当您的应用程序恰好处于您从未想过要测试的特定状态时,它会中断。
当然,完全可能在单元测试中存在缺少角落情况的缺口。但是如果测试的结果是100%基于输入那么你就更有可能只是通过查看减速器所期望的输入来注意那些极端情况。
如果函数更改了应用程序的状态,则运行相同的函数两次,或者以不同的顺序运行相同的几个函数,可能会导致完全不同的行为。这使得很难推断应用程序的正确性,因为为了知道给定的代码行是否正确,您必须知道在调用它之前发生了什么,可能是在应用程序的完全不同的部分。
答案 1 :(得分:2)
是否因为你保证在之后具有完全相同的状态 运行减速器?
是的,这就是使纯还原剂成为“黄金标准”的原因。如果输出仅取决于输入,则很容易测试,重放,保存历史记录等......
如果是这样,那么即使是有效的(即非纯粹的)减速器也可以 这个属性?
(不是流行的答案)。这也是正确的。如果你小心的话,非纯粹的减速器也可以具有这些相同的属性。但是,它更容易出错,并且(概念上)没有多大意义。我认为(我认为)的想法是,一切都只是输入和输出。您可以稍微改变一下思路,并将“非纯”减速器的内部状态视为减速器的另一个输入。
从这个意义上讲,您可以想象跟踪您的应用程序状态,您的操作以及减速器的内部状态,并最终获得纯粹减速器的相同回放等属性(尽管您需要更多用来处理的代码。)
但是,这就是问题:现在你有了实际的应用程序状态和reducer的内部(和隐藏)状态。谁想跟踪两套国家?这才真正使测试,推理和实施变得更加困难。有更多“种类”的东西要跟踪,更容易错过/忘记关键细节。从本质上讲,如果您的应用程序中有很大一部分用于跟踪状态,那么为什么希望将更多状态隐藏在Reducer中?
因此,即使为了“正确”而无视正确的事情,从概念上讲,整个系统架构在一个地方保持您的所有状态更为简单。