【问题标题】:Do reducers in Redux represent a FSA?Redux 中的 reducer 是否代表 FSA?
【发布时间】:2018-07-29 17:08:59
【问题描述】:

最近我一直在学习 Redux,在阅读文档时,我遇到了一个叫做 reducers 的东西。 根据doc

reducer 是一个纯函数,它采用先前的状态an 动作,然后返回下一个状态

(previousState, action) => newState;

这对于 Finite State Automata 听起来有些熟悉,它接受 当前状态输入 并转到 下一个状态。

那么将 reducers 视为 FSA 是否正确,或者它是不同的东西?

【问题讨论】:

    标签: javascript redux finite-automata


    【解决方案1】:

    reducer 描述了确定性的状态转换,因此您认为它听起来类似于 FSA 是正确的。

    主要区别在于reducer只描述确定性状态转换,它不限制它可以传递的可能状态或动作。

    reducer 可以传递无数种不同的状态,也可以传递无数种不同的动作,因此 reducer 本身并不能描述确定性状态自动机。

    reducer 与对有限数量的状态的描述和可以传递给它的有限数量的可能动作的描述共同构成确定性有限自动机的定义。

    【讨论】:

    • 有道理。
    • 我有一个问题。在任何现实世界的应用程序中,是否存在该应用程序具有无限状态无限操作的用例?
    • 是的,几乎每个应用程序都有无限的状态和/或动作。例如,来自Redux docs 的 todoApp 可以处于无数种不同的状态(所有可能的 todo 项的组合),并且可以生成无数个唯一的 ADD_TODO 动作(每个可能的新 todo 项一个)
    • 啊,现在我明白了。感谢你的回答。 :)
    • 很高兴,很高兴为您提供帮助
    【解决方案2】:

    这是一个有点抽象的问题,但我会说

    虽然通常 FSA 确实会接收 action 并以与 redux 相同的方式更新机器 state,但它在一个一般概念上仍然不同,即 FSA 具有有限数量的状态,这对于 redux reducer 是不正确的。

    对于大多数使用 redux 的场景,您并不真正知道下一个操作将包含什么有效负载。

    以 FSA 为例:电梯

    电梯的层数是有限的。它可以转到每一个,也可以返回到默认的一个(大厅)。这里的一切都被严格定义。可以知道每个状态和转换组合。

    在 redux 中,这也适用于过滤器下拉列表,用户可以在其中从固定的项目列表中进行选择或重置过滤器。

    但是,如果您将 html 输入元素值推送到状态,您并不真正知道用户将输入什么,并且每个输入都会产生一个新状态。以这种方式,redux reducer 中的状态数可能会无限

    我会说这将与无限树自动机更加内联,这是您正在关注的模式的扩展:

    https://en.wikipedia.org/wiki/Infinite_tree_automaton

    【讨论】:

    • 我明白了你想说的话,除了这个However, if you are pushing a html input element value to the state, you don't really know what the user will input and each input will produce a new state. 之外,大部分答案都是有意义的?
    • 很多。假设您有一个多步骤注册表单(例如 react native),并且您希望在将完整的用户信息推送到后端(例如 firebase)之前将所有用户数据保存到 onboarding reducer。另一个例子是全局搜索栏组件。将状态推送到搜索缩减器是有意义的(假设我们在那里有一个名为 query 的道具),这样如果您的用户更改您网站上的路线,您的搜索不会重置。
    • 感谢您的回答。现在说得通了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2018-05-29
    • 2019-12-11
    相关资源
    最近更新 更多