首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我们必须将状态/突变/动作分开?

将状态、突变和动作分开是为了实现更好的代码组织和可维护性。以下是详细解答:

在软件开发中,将状态、突变和动作分开是一种常见的设计原则,被广泛应用于各种编程范式和框架中。这种分离的设计有助于提高代码的可读性、可维护性和可测试性。

  1. 状态(State):状态是指程序或系统在某一时刻的数据表示。它描述了系统的当前情况或属性。将状态与其他组件分离,可以使代码更加清晰和易于理解。状态通常以数据结构的形式存在,可以是简单的变量、对象或数据集合。
  2. 突变(Mutation):突变是指对状态进行修改或更新的操作。突变可以改变系统的状态,使其从一个状态转变为另一个状态。突变可以是直接修改状态的值,也可以是通过调用特定的函数或方法来实现。将突变与状态分开,可以使代码更加模块化和可测试。
  3. 动作(Action):动作是指系统中的某个行为或操作。它可以是用户的输入、事件的触发或其他外部因素导致的操作。动作可以触发突变,从而改变系统的状态。将动作与状态和突变分离,可以使代码更加可扩展和灵活。

将状态、突变和动作分开的好处包括:

  • 代码组织清晰:将状态、突变和动作分开可以使代码的逻辑更加清晰和易于理解。不同的组件负责不同的功能,使代码结构更加模块化和可维护。
  • 可维护性高:通过将状态、突变和动作分开,可以使代码更易于维护和修改。当需要修改状态或添加新的动作时,只需关注特定的组件,而不会影响到其他部分的代码。
  • 可测试性强:将状态、突变和动作分开可以使单元测试更加容易。可以针对每个组件编写独立的测试用例,验证其在给定输入下的行为和状态变化。
  • 可扩展性好:通过将状态、突变和动作分开,可以更容易地扩展系统的功能。可以添加新的动作或突变,而不会对现有的状态和其他组件产生影响。

总结起来,将状态、突变和动作分开是一种良好的设计原则,可以提高代码的可读性、可维护性、可测试性和可扩展性。这种设计思想在各种编程范式和框架中都有应用,例如面向对象编程、函数式编程、React、Redux等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

我用 React 和 Vue 构建了同款应用,来看看哪里不一样(2020 版)

Vue 本质上创建了一个数据对象,可以在其中自由更新数据,而 React 通过所谓的状态 Hook 来处理数据突变。 从下面的图片中可以看到两者的设置,然后我们会具体说明: React 状态: ?...你会注意到,应用中的每个状态数据(也就是我们希望能够突变的数据)都包装在一个 ref() 函数内部。这个 ref() 函数是我们从 Vue 导入的,可让我们的应用在这些数据更改 / 更新时完成更新。...那么为什么 React 会费劲地将值与函数分开,还要使用 useState() 呢?这是因为当状态改变时,React 希望重新运行某些生命周期 Hooks。...在页面加载时,我们须将 todo 设置为一个空字符串,例如:const todo = ref("")。...如 Vue 部分所述,设置一个事件侦听器来侦听按下 Enter 键的动作有点复杂。

4.8K30
  • Vue.js 状态管理:Pinia 与 Vuex

    这两个库都非常适合状态管理,但是由于它们出色的特性和功能,选择哪个库用于你的项目需要时间并且令人沮丧。好吧,我们将在本文中看看为什么一个是最好的。...:状态动作突变。...状态返回当前的todoListItems,动作提交一个突变来创建一个新项目,最后,突变创建新项目并将其添加到列表中。...当你构建一个更大的应用程序时,你可能会意识到动作突变相对相似,导致冗余代码,因为每个状态变化都需要一个样板。 Pinia 使用 Pinia 简单 API,您可以消除突变和冗余代码。...使用 Pinia,我们删除了突变并将其直接更新到我们动作中。 注意:在上面的代码示例中,当我们将项目直接提交给我们的操作时,我们不需要跟踪我们的项目。

    2.6K20

    【19】进大厂必须掌握的面试题-50个React面试

    动作是描述更改的普通JS对象。就像状态是数据的最小表示一样,操作是数据更改的最小表示。 使用纯函数进行更改: 为了指定操作如何转换状态树,您需要纯函数。...41.在Redux中如何定义动作? React中的动作必须具有type属性,该属性指示正在执行的ACTION的类型。必须将它们定义为String常量,您也可以为其添加更多属性。...我们可以将中间件传递给商店以处理数据处理,并保留更改商店状态的各种操作的日志。所有动作都通过减速器返回新状态。 44. Redux与Flux有何不同?...Flux Redux 1.存储包含状态和更改逻辑 1.存储和更改逻辑是分开的 2.有多家商店 2.只有一家商店 3.所有商店都断开连接并保持平坦 3.带有分层减速器的单店 4.有单身派遣员 4.没有调度员的概念...48.为什么我们在React中需要一个Router? 路由器用于定义多个路由,并且当用户键入特定的URL时,如果此URL与路由器内部定义的任何“路由”的路径匹配,则用户将被重定向到该特定的路由。

    11.2K30

    一篇文章带你对Java对象创建过程解密

    主要有两种分配方式: 指针碰撞 空闲列表 接下来我们详细说说这两种分配内存的方式: 指针碰撞 其实这种方式理解起来比较简单的,假设Java堆中的内存是绝对完整的,它会把使用过的内存和未使用过的内存划分开来...接下来我们简单的捋一下 其实保证线程安全还是两种方式: 将分配内存空间的动作进行同步处理(虚拟机底层的实现逻辑就是CAS + 失败重试)来保证分配内存空间的原子性。...还有一种就是将分配内存的动作按照线程划分在不同的空间中进行,也就是每个线程在Java堆中有有属于自己的一小块内存,这种方式叫做本地线程分配缓冲 Thread Local Allocation Buffer...Step3:初始零值 当分配完内存后,虚拟机必须将分配到的内存空间(不包含对象头)都初始化为零值。如果使用了TLAB,那么这一步会在TLAB分配时进行。为什么虚拟机要有这番操作呢?...对象中需要的其它资源和状态信息还没有按照原有的意图去构造好。所以一般来说,new指令之后就会执行init方法,按照Java程序员的意图去对对象做一个初始化,这样之后一个真正完整可用的对象才构造出来

    16010

    必须要会的 50 个React 面试题(下)

    单一事实来源:整个应用的状态存储在单个 store 中的对象/状态树里。单一状态树可以更容易地跟踪随时间的变化,并调试或检查应用程序。 状态是只读的:改变状态的唯一方法是去触发一个动作。...Store 包含状态和更改逻辑 1. Store 和更改逻辑是分开的 2. 有多个 Store 2. 只有一个 Store 3. 所有 Store 都互不影响且是平级的 3....Redux 的优点如下: 结果的可预测性 - 由于总是存在一个真实来源,即 store ,因此不存在如何将当前状态动作和应用的其他部分同步的问题。...为什么React Router v4中使用 switch 关键字 ?...包是分开的:共有三个包,分别用于 Web、Native 和 Core。这使我们应用更加紧凑。基于类似的编码风格很容易进行切换。 50. React Router与常规路由有何不同?

    3.5K21

    React学习(最终篇)—— 高阶应用:高阶组件(HOCs)

    本文会讨论为什么HOCs非常有用,并且介绍如何开发自定义的HOCs。...可以阅读这篇文章(Mixins Considered Harmful)了解为什么官方已经不再推荐使用“混合器”以及将代码转换成其他模式的方式。 组件是React中代码重用的主要单元。...首先是输入的组件不能与HOC分开使用,比如例子中的 componentWillReceiveProps 生命周期方法被增强组件覆盖,那么必须保证原始组件中 componentWillReceiveProps...容器会管理各种各样的内容,例如:订阅、状态,以及将属性数据传递到子组件中以实现底层组件的渲染功能。容器组件是HOCs模式实现的一部分,可以将HOCs模式看作一个参数化的容器组件。...return ; } 这个问题并不仅仅是和性能有关,每次重建一个组件会导致组件以及子组件已有的状态都会丢失。

    1.7K41

    如何刻画人物?一个简单的人物刻画公式和有效的 AI 提示语

    主角是人推着故事走,配角是故事推着人走,两个要区分开我们会根据主角的需要调整情节设计,但很少会根据配角的设定修改情节设计。 设置配角,首先要思考以下几个要素: 1,配角在这段剧情里的作用是什么?...最平常的比如主角性格特征是人不犯我我不犯人,人若犯我我加倍奉还,这时候可以一引出一个爱挑事,爱装逼的配角来突出主角这一性格。 3,根据戏份多少来考虑配角人设的完整度。...在创作中,我们既需要依靠设定,让人物稳定,但又不能用设定将人物框死。人物在故事中也会成长,性格可能也会发生变化,尤其是主角,主角的性格显然是有人物成长曲线的。配角在关键时刻也有性格突变。...反复思考这个情节发生后,人设的改变是不是我们能写清楚的,我们能否生动的刻画出来?...2,人设加强,就是要加强印象上的描写,例如语言上,外貌上,动作上都可以。 3,给人物一个争议点,加深记忆,正反相结合,达到一个类似平衡的状态。那反面人物就缺点突出一点,正面人物就优点突出一点。

    30410

    威佐夫博弈

    后手都有办法获胜,我们将其称为先手输态,(1,2)就是一个先手输态。...按照上述的分析方法往下分析我们可以发现: (0,0,) (1,2) (3,5) (4,7) (6,10) (8,13) (9,15) (11,18) 等等都是先手输态。...寻找上面这些输态的规律,可以发现:每个输态的两堆石子数的差值是递增且相差1,并且每个状态的第一个数字都是前面所有状态里未出现的最小自然数。...并且,每个状态的第一个值等于当前状态的差值乘上黄金分割率(0.618),关于为什么会是黄金分割率,可以看知乎的一篇文章:传送门 例题 时间限制:1000ms 内存限制:65536KiB 三个蒟蒻一台戏...,否则就必胜,对于输出策略,就是输出所有可能的输态,我们假设第一堆纸团数小于第二堆纸团数,一共三种可能: 两堆纸团各取相同多的纸团,这种情况两堆纸团的差值是不变的,所有根据差值判断一下是否有合法的输态即可

    36120

    您可能不需要使用Vue 3的Vuex

    Vuex是一个很棒的状态管理库。它很简单,并且可以与Vue很好地集成。为什么有人会离开Vuex?原因可能是即将发布的Vue 3版本暴露了底层的反应系统,并引入了构建应用程序的新方法。...可以通过可访问可写存储的单独功能来处理突变。...通过保护状态免受不必要的修改,新解决方案相对接近Vuex。 摘要 通过使用Vue 3的反应性系统和依赖项注入机制,我们已经从本地状态转变为可以在较小的应用程序中替代Vuex的集中状态管理。...我们有一个状态对象,该对象是只读的,并且对模板的更改有反应。只能通过Vuex中的动作/突变等特定方法来修改状态。您可以使用computed函数定义其他获取器。...Vuex具有更多功能,例如模块处理,但有时我们不需要。 如果您想了解Vue 3并尝试这种状态管理方法,请查看我的Vue 3游乐场。

    1.4K30

    规则引擎在IoT的重要性?

    (非技术成员使用) 如果您必须将所有业务逻辑都放在一个项目中,和其他所有应用程序分开,那么您将在哪里保存它?...条件动作(Condition-Action)引擎 基于条件-动作(CA)规则引擎属于前向链接引擎,但存在一些相关的差异,特别是在物联网领域。...IBM的OpenWhisk是一个基于流的编程示例,它通过链接云函数(IBM称之为动作)实现编程。另一种无服务器编排方法(如AWS step functions)基于有限状态机规则引擎。...有限状态机(finite state machines)引擎 状态机可用于根据系统经历的一组状态来描述系统。状态是对等待执行转换的系统状态的描述。过渡是在满足条件或接收到事件时要执行的一组动作。...逻辑与核心应用程序逻辑分开管理,因此可以对其进行管理和重用。 在规则引擎中,我们使用不同的模式匹配和冲突解决算法,可提供高性能。 对于经常变化的需求,我们可以轻松地更新规则。无需更改代码。

    2.5K30

    生信爱好者周刊(第 1 期):生信是什么

    这项研究揭示了大规模结构突变在癌症中所发挥的广泛作用,识别了之前未知的基因调控区域的癌症相关突变,推断了多种癌症类型的肿瘤进化,阐明了体细胞突变和转录组之间的相互作用,并研究了种系遗传变异在调节突变过程中的作用...命令行界面一开始看起来很陌生,所以这本书试图在使用命令行和你通常使用鼠标和键盘时采取的动作之间画出相似之处。...3、廖雪峰的Python教程[19](中文) 学习Python必读推荐。...我们根据每年开设的计算基因组学课程开发了这本书。我们总是有来自物理、生物、医学、数学、计算机科学或其他定量领域的跨学科听众。...我们希望这本书是一个起点,为计算基因组学学生和进一步的数据分析在基因组学更具体的主题指南。这就是为什么我们试图涵盖从编程到基础基因组生物学的各种各样的主题。

    92930

    三极管开关电路_利用三极管设计开关电路

    输入电压 Vin 则控制三极管开关的开启(open) 与闭合(closed) 动作,当三极管呈开启状态时, 负载电流便被阻断,反之,当三极管呈闭合状态时,电流便可以流通。...通常在设计时,为了可以更确定三极管处于截止状态起见,往往使 Vin 值低于 0.3V。 黄色圈圈处,本质就是一个二极管。...当然输入电压愈接近零伏特便愈能保证三极管开关处于截止状态。欲将电流传送到负载上,则三极管的集电极与射极必须短路,就像机械开关的闭合动作一样。...一般的机械式开关在导通的瞬间会有快速的连续启闭动作,然后才能逐渐达到稳定状态。 (4)利用三极管开关来驱动电感性负载时,在开关开启的瞬间,不致有火花产生。...加速电容构成微分电路,利用电容两端电压不能突变的特性让输入瞬间的变化量直接引入到三极管基极,用过冲加快三极管的状态变化。等过渡过程结束后又回归到两个电阻的直流分压,所以电容不影响饱和深度。

    1.1K30

    继电器驱动电路(各种单片机、CD4013触发器驱动电路图)

    继电器的继电特性 继电器的输入信号 x 从零连续增加达到衔铁开始吸合时的动作值 xx,继电器的输出信号立刻从 y=0 跳跃y=ym,即常开触点从断到通。...我们把继电器的这种特性叫做继电特性,也叫继电器的输入-输出特性。 继电器(relay)的工作原理和特性 电磁继电器的工作原理和特性 电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。...原理是电路闭合的瞬间,电容 C 两端电压不能突变可视为短路,这样就将比继电器线圈额定工作电压高的电源电压加到线圈上, 从而加快了线圈中电流增大的速度,使继电器迅速吸合。...晶体管驱动电路 当晶体管用来驱动继电器时,必须将晶体管的发射极接地。...,这个简单的电路为什么会烧继电器线圈?

    1.5K10

    【领域驱动设计】Redux 和领域驱动设计

    它不会更改其状态或任何数据。这是你要求的东西,它会以信息回应。没有副作用。查询示例:列出可用的帖子。 命令:是对突变的请求。他们可能会工作,也可能会失败。系统执行它们并返回结果。...他们消费领域事件以保持其状态一致,同时,他们为每个突变生成新的领域事件。聚合示例:post。 不幸的是,许多人混淆了命令和领域事件。两者都是动词,都可能暗示状态的变化,但它们是不同的。...这就是为什么命令可能会失败,但域事件不会。命令是我们想要发生的事情,而领域事件是已经发生的事情。...让我们将之前的概念与 Redux 进行比较: 查询:它们是选择器。选择器从状态中获取一条信息。 命令:它们是动作。当我们调度一个动作时,我们提交一个新命令。...我们减少了应用程序的耦合,我们可以在不更改任何代码的情况下从系统中插入和拔出单元。 Redux 做同样的解耦。每个组合的减速器就像一个聚合体。当 reducer 收到一个动作时,它会独立地减少它。

    1.5K30

    强化学习从基础到进阶-常见问题和面试知必答:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代

    强化学习从基础到进阶-常见问题和面试知必答2:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代 1.马尔科夫决策核心词汇 马尔可夫性质(Markov property,MP):如果某一个过程未来的状态与过去的状态无关...所以当我们说某一个马尔可夫决策过程的环境可解时,其实就是我们可以得到一个最佳价值函数。 2.常见问题汇总 2.1为什么在马尔可夫奖励过程中需要有折扣因子?...2.2 为什么矩阵形式的贝尔曼方程的解析解比较难求得? 通过矩阵求逆的过程,我们就可以把 $V$ 的解析解求出来。...在马尔可夫决策过程中,状态的转移函数 $P(s'|s,a)$ 是基于它的当前状态和当前动作的,因为我们现在已知策略函数,即在每一个状态我们知道其采取每一个动作的概率,所以我们就可以直接把这个动作进行加和...具体方法如下, (1)穷举法(一般不使用):假设我们有有限个状态、有限个动作可能性,那么每个状态我们可以采取 $A$ 种动作策略,那么总共就是 $|A|^{|S|}$ 个可能的策略。

    29921

    强化学习从基础到进阶-常见问题和面试知必答::深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN

    2.常见问题汇总 2.为什么在深度Q网络中采用价值函数近似的表示方法?...就算是异策略,就算是这些经验不是来自 \pi ,我们还是可以使用这些经验来估测 Q_{\pi}(s,a) 。 2.12 为什么传统的深度Q网络的效果并不好?...但是对于双深度Q网络的两个Q网络,第一个Q网络决定哪一个动作的Q值最大,以此来决定选取的动作我们的Q值是用 Q' 算出来的,这样有什么好处呢?为什么这样就可以避免过度估计的问题呢?...(4)第四个方案:不用深度Q网络,毕竟用其处理连续动作比较麻烦。 3.面试知必答 3.1 友善的面试官:请问深度Q网络是什么?其两个关键性的技巧分别是什么?...引入状态奖励的是哪种? 深度Q网络有3个经典的变种:双深度Q网络、竞争深度Q网络、优先级双深度Q网络。 (1)双深度Q网络:将动作选择和价值估计分开,避免Q值被过高估计。

    62531

    Vue.js 3 使用 Vuex 进行状态管理的综合指南

    随着 Vue.js 3 的发布,Vue 应用程序中的状态管理变得更加高效和灵活。在本文中,我们将深入探讨 Vue.js 3 状态管理,涵盖基本概念并提供实际示例。什么是状态管理?...它遵循 Flux 架构模式,并提供一个集中存储,您可以在其中存储、检索和更新应用程序范围的状态。让我们探索如何在 Vue.js 3 应用程序中设置和使用 Vuex。...我们还将突变和操作映射到方法,使我们能够轻松地与商店交互。常见问题解答部分Q1:Vuex 中的状态突变动作和 getter 之间有什么区别?state是您定义应用程序数据的地方。...mutations负责改变状态。它们必须是同步的。actions用于异步提交突变或在提交突变之前执行复杂的逻辑。getters用于检索和计算具有计算属性的状态数据。...您可以创建可重用的组合函数来封装状态、​​突变、操作和 getter,使您的代码更加模块化和可维护。

    97800

    单细胞、空间、外显子多组学分析探讨

    多组学的内容让我们看问题更加全面一点,基因表达只是表象、基因突变是根本,空间排布是微环境、VDJ是免疫反应,这几方面都已经讲了很多了,但是大家要明白一个深刻的道理,任何事情的发生都不是单一因素造成的,而是多因素联合的结果...以前的策略是不同组之间有差异、有交集就算是比较好的去批次效果,但是这是没有任何实际道理的,只是人为的一种判断,但是引入多组学,很多问题就变得非常明显,如下图:如果仅以单细胞表达数据来判断,那么聚类几乎几乎是按照样本分开的...包括下面的情况:引入驱动突变,自然会解决很大的问题。...分析方法并没有变,只是融合了多组学信息,看到的内容很多都刷新了我们的认知,例如文章中两条路径共享一个中间状态的细胞群,这群细胞同时具有2型肺泡细胞特征和1型肺泡细胞的基因表达特征。...第五点,空间组学(10X 与 DSP)为什么这两个空间组学最好,原因就在于数据和图片的灵活配对。华大目前还做不到这一点。

    20410
    领券