纯还原器没有副作用,可以启用时间旅行。他们使有关应用程序行为的推理更加容易。
这对我很直观。但是我无法阐明为什么纯还原器会导致这些积极的非功能属性。
有人可以帮助我表达自己的意思,为什么要使还原副作用免费,使有关应用程序行为的推理更加容易?
是因为您保证在运行还原器后具有完全相同的状态吗?
如果是这样,肯定甚至是副作用(即非纯(还原器可以拥有此属性?
是因为您保证在运行还原器后具有完全相同的状态吗?
是,纯还原器是确定性,这意味着如果给出了相同的输入,它们将始终产生相同的结果输出。此属性有助于诸如单元测试之类的情况,因为您知道测试是否通过一次,它将始终通过。
如果是这样,肯定甚至是副作用(即非纯(还原器可以拥有此属性?
否,不纯净的还原器将同时依靠输入和应用程序的 state 。在您进行测试时,它们的行为可能是1000次,但是当您的应用程序处于从未想过测试的特定状态时,请打破。
当然,在单元测试中可能会遇到差异,而这是一个差距,但会遇到差异。但是,如果测试的结果是100%基于输入 ,那么您就更有可能仅通过查看还原器期望的指定输入而注意到这些角案。
如果一个函数更改了应用程序的状态,则两次运行相同的函数,或者在不同订单中的相同功能可能会导致完全不同的行为。这很难理解应用程序的正确性,因为要知道给定的代码是否正确,您必须在调用它之前知道发生了什么,可能在应用程序的完全不同的部分中。
是因为您保证在之后具有完全相同的状态 运行还原器?
是的,这就是使纯还原器成为"黄金标准"的原因。如果输出仅取决于输入,则非常容易测试,重播,保留历史等...
如果是这样,肯定甚至是副作用(即。 这个属性?
(不是流行的答案(。这也是正确的。如果您小心,非纯还原器也可以具有相同的属性。但是,这更容易容易出错,并且(从概念上(做到这一点并没有多大意义。您(我认为(您正在获得的想法是,一切都是输入和输出。您可以更改思维方式,并将"非纯"还原器的内部状态视为还对您的还原器进行的另一项输入。
从这个意义上说,您可以想象跟踪应用程序状态,动作和还原器的内部状态,最终获得相同的播放等纯还原器的属性(尽管您需要更多代码来处理(。
但是,这是摩擦:现在您拥有实际的应用状态和还原器的内部(和隐藏(状态。谁想跟踪两组状态?这就是真正使测试,推理和实施更加困难的原因。还有更多的"类型"要跟踪,并且更容易错过/忘记关键细节。从本质上讲,如果您已经有大部分申请专门用于跟踪状态,为什么您要想要将更多的状态隐藏在还原器中?
因此,即使是为了"正确的"而忽略正确的事情,从概念上来说,整个系统体系结构将您的所有状态都放在一个地方。