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

如何以面向对象的思想设计有限状态机

代码实现 嵌套的 switch 语句 使用嵌套的 switch 语句是最为直接的办法,也是最容易想的方法,第一层 switch 用于状态管理,第二层 switch 用于管理各个状态下的各个事件。...代码实现可以用下述伪代码来实现: switch(当前状态) { case LOCKED 状态: switch(事件): { case card 事件: 切换至...; } break; case UNLOCKED 状态: switch(事件): { case card 事件: 执行 thankyou...,矩形,星形,无论是什么图形,其共性都是需要调用一个画的方法来进行绘制绘制形状可以通过函数指针调用各自的绘图代码绘制,这就是多态的意义,根据对象的类型调用不同的处理函数。...这篇文章是笔者学习了《程序设计与数据结构》周立功版后的自己的理解,该书的PDF版可以从立功科技官网的周立功专栏获取,也可以公众号回复 程序设计与数据结构获取,同时关于面向对象状态机的代码汇总版也可以公众号回复

44810

如何以面向对象的思想设计有限状态机

代码实现 嵌套的 switch 语句 使用嵌套的 switch 语句是最为直接的办法,也是最容易想的方法,第一层 switch 用于状态管理,第二层 switch 用于管理各个状态下的各个事件。...代码实现可以用下述伪代码来实现: switch(当前状态) { case LOCKED 状态: switch(事件): { case card 事件: 切换至 UNLOCKED 状态;...执行 unlock 动作; break; case pass 事件: 执行 alarm 动作; break; } break; case UNLOCKED 状态: switch(事件...,矩形,星形,无论是什么图形,其共性都是需要调用一个画的方法来进行绘制绘制形状可以通过函数指针调用各自的绘图代码绘制,这就是多态的意义,根据对象的类型调用不同的处理函数。...介绍了上述很基本的概念之后,我们来看状态机的设计。

1.3K00
您找到你想要的搜索结果了吗?
是的
没有找到

javascript的生成器和迭代器是什么

生成器函数通过function*语法来定义,函数体内使用yield语句可以暂停函数执行,并将值返回给调用方。调用方可以通过迭代器对象来恢复生成器函数的执行,并在下一个yield语句处继续执行。...函数体内部,使用了while(true)循环来生成数列的每一项。每次循环中,更新prev和curr变量的值,然后使用yield语句返回当前项的值。这个函数可以无限地生成数列,因为它没有终止条件。...generator实现状态机, JavaScript ,可以使用生成器实现状态机,这样可以简化状态机的实现和维护。...状态机,我们定义了一个状态变量 state,并使用 while 循环和 yield 关键字来构建状态机的迭代器。...根据当前状态和输入值,我们使用 switch 语句来判断状态机的转移逻辑,并更新状态变量 state。最后,我们通过调用 next 方法来启动状态机的迭代器,并逐步输入指定的输入值。

6310

面试官问我有用过状态机吗?

引言:软件开发状态机(State Machine)是一种重要的概念,用于描述对象或系统不同状态之间的转换和行为。理解状态机对于开发人员来说是至关重要的,特别是处理复杂的业务逻辑或状态管理时。...动作(Action):状态转换过程执行的操作或行为,例如更新状态、记录日志等。 状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。...简单实现 计算机状态机通常用编程语言来实现。 C、C++、Java、Python 等编程语言中,可以通过使用 switch-case 语句、if-else 语句、状态转移表等来实现状态机。...在下面还有更加优雅的方式,使用 Spring 状态机 来实现。 if-else 实现状态机 在上面的示例,我们使用 if-else 结构根据当前活动来控制音乐的播放状态,并执行相应的行为。...实现状态机 在这个示例,我们使用 switch-case 结构根据不同的活动来控制音乐的播放状态,并执行相应的行为。

12210

从零开始的状态机漫谈(2)——switch:你的状态机初恋

“面向嵌入式环境”“高度简化”了的实用型状态图绘制方法——这里的“简化”是相对UML状态图的“繁杂”而言、且更接近课本上所使用状态机图例;而这里的“实用”体现在:基于这套方法绘制的状态图是可以“无脑”...(本文撰写于2021年情人节) 【状态函数返回值的“小心思”】 ---- 对很多人来说,即便状态机“初恋”不是使用switch编写的函数,也一定逃不开使用函数作为状态机载体的形式(比如使用大量if-else...所携带的执行动作一般用作状态机的初始化——比如初始化状态机使用的变量等等; 如果状态机需要动态申请资源,比如malloc,考虑到失败的可能,如果允许重试,则这类资源分配代码就不能放置START,因为我们说过...【细数那些绝对要杜绝的“骚操作”】 ---- 设计状态机或者翻译switch状态机的过程,以下常见“骚操作”是应该避免的: 一个函数里塞入多个switch状态机实现——请记住,每个switch状态机都应该有自己专属的一个函数...【后记】 ---- 相信对很多人来说,switch状态机都是它们裸机环境下的“制胜法宝”,我并不准备否认这一点,相反,我希望通过这篇文章,能够分享一下我使用switch方式翻译状态图的一些做法以及背后的思考

1.6K11

从零开始的状态机漫谈(3)——状态机设计原则:清晰!清晰!还是清晰!

回顾下之前介绍的内容: 《从零开始的状态机漫谈(1)——万物之始的语言》一方面介绍了状态机计算机科学的核心地位,另一方面着重介绍了一种嵌入式环境下容易使用状态机图例; 《从零开始的状态机漫谈(2...)—— switch:你的状态机初恋》介绍了一种以switch为核心的状态图翻译方式; 本文介绍的设计原则对状态机来说虽然是具有通用意义的,但所使用的图例以及对应的代码翻译规则却是建立在前两篇文章的基础上的...普通的应用逻辑使用状态图描述逻辑也具有这种“让人一目了然”的潜力;理论上,通过读图理解设计者意图的速度应该远高于直接阅读翻译后代码的速度——遗憾的是,实践由于缺乏正确的设计原则指导,很多人绘制的状态图恐怕还不如代码看起来好懂...一个系统可以有多个reset小圆点。有的小伙伴可能要问,为啥不是“跃迁到状态机的第一个状态”而一定要使用reset小圆点呢?...比如,我们把此类切换从实线箭头修改为虚线箭头——表示此类切换不“主动”出让CPU控制权,则修改后的图如下所示: 那么switch状态机,这类“不让出CPU”的切换,实际上就是“切换任务的同时确保不会退出状态机函数

8.1K21

熟悉OC--5:用枚举表示状态、选项、状态码

, }; 定义选项的时候,若这些选项可以彼此组合,各个选项之间可以通过按“按位或操作符”来组合,那么枚举值可定义为2的幂 typedef NS_ENUM(NSInteger, UIInterfaceOrientation...*)window{ return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight; } switch...中使用枚举来定义状态机,最好不要用default,如果使用default,当枚举添加一个值,编译器不会发出警告,但是switch不加default,编译器会有警告提示信息 typedef NS_ENUM...(state) { case LoginStateFail: break; case LoginStateSuccess:...break; } } 重点 应该用枚举值来表示状态机的状态 多个选项可以同时存在,可以使用枚举类型,可以将各选项值定义为2的幂,以便通过按位或操作将其组合 3.处理switch语句中不要带有default

13310

Linux有限状态机FSM的理解与实现

有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,计算机领域有着广泛的应用。...FSM是一种逻辑单元内部的一种高效编程方法,服务器编程,服务器可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。 那有限状态机通常在什么地方被用到?...一、使用if/else if语句实现的FSM 使用if/else if语句是实现的FSM最简单最易懂的方法,我们只需要通过大量的if /else if语句来判断状态值来执行相应的逻辑处理。...看看下面的例子,我们使用了大量的if/else if语句实现了一个简单的状态机,做到了根据状态的不同执行相应的操作,并且实现了状态的跳转。...二、使用switch实现FSM 使用switch语句实现的FSM的结构变得更为清晰了,其缺点也是明显的:这种设计方法虽然简单,通过一大堆判断来处理,适合小规模的状态切换流程,但如果规模扩大难以扩展和维护

2.6K10

这3种优雅的嵌入式软件架构,你值得拥有!

用C语言实现状态机,主要有三种方法:switchcase 法、表格驱动法、函数指针法。下面给大家详细介绍一下。...01 switchcase 法 状态用 switchcase 组织起来, 将事件也用switchcase 组织起来, 然后让其中一个 switchcase 整体插入到另一个 switchcase...关于 switchcase 法还有最后一点要说明, 因为 switchcase 的原理是从上到下挨个比较,越靠后,查找耗费的时间就越长,所以要注意状态和事件各自的 switch 语句中的安排顺序,...如果不小心在数组填错了位置, 那么程序跑起来就和设计者的意图南辕北辙了, 远没有 switchcase改动来得方便、安全。...阉割版表格驱动法,又名压缩表格驱动法,一维状态表格与事件 switchcase 的合体。压缩表格驱动法使用了一维数组作为驱动表格,数组的下标即是状态机的各个状态。

43440

STM32状态机编程实例——全自动洗衣机(上)

STM32按键消抖——入门状态机思维 STM32按键状态机2——状态简化与增加长按功能 STM32按键状态机3——增加双击与功能优化 本篇,继续使用状态机编程,来实现一个更有趣的功能——全自动洗衣机。...另外,不同的工作阶段,按下暂停键可以让洗衣任务暂停,再按继续可让洗衣任务继续。...3 编程实现 3.1 多按键检测功能 本篇介绍的洗衣机的按键,仅需要检测按键单击即可,不需要双击与长按功能,因此,可使用之前文章介绍的最基础的按键状态机来为洗衣机状态机提供按键事件。...get_press_key_idx函数,用于洗衣机程序来获取不同按键的按下事件,每次获取后,将按键事件清除(g_keyPressIdx设为无效值-1) 3.2 洗衣功能 按照上面绘制的洗衣机状态图,使用...= -1) { switch(idx) { case 0: washerKey = W_KEY_POWER; break; //电源键按下 case 1: washerKey =

88720

Python 高级教程之结构化模式匹配

尽管 Switch 语句是大多数语言的共同特征,但 Python 没有使用 Switch 语句。...具体来说,模式匹配通过以下方式进行操作: 使用具有类型和形状的数据 (the subject) 评估语句subject的match case从上到下将主题与语句中的每个模式进行比较,直到确认匹配。...声明式方法 读者可能会通过使用 C、Java 或 JavaScript(以及许多其他语言)switch 语句将主题(数据对象)与文字(模式)进行匹配的简单示例来了解模式匹配。...switch 语句通常用于将对象/表达式与包含文字的 case 语句进行比较。 更强大的模式匹配示例可以 Scala 和 Elixir 等语言中找到。...虽然结构模式匹配可以以最简单的形式使用,将变量与 case 语句中的文字进行比较,但它对 Python 的真正价值在于它对主题类型和形状的处理。

57330

带你走进从零认识JavaScript到精髓(五)JavaScript 分支语句

一、什么是JavaScript语句 表达式javascript是短语,换行的短语或分号结束的短语就是一行语句JavaScript 语句向浏览器发出的命令。语句的作用是告诉浏览器该做什么。...语句的作用是告诉浏览器该做什么。 分号 分号用于分隔 JavaScript 语句。 通常我们每条可执行的语句结尾添加分号。 使用分号的另一用处是一行编写多条语句。...您可以代码中使用条件语句来完成该任务。... JavaScript ,我们可使用以下条件语句: if 语句 - 只有当指定条件为 true 时,使用语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false...case穿透 由于switch case语句比较的时候用的是全等 语法: /* switch-case 选择结构 条件是一个具体的数据,使用具体的数据和case的数据进行全等比较 switch

43100

状态机编程实例-嵌套switch-case

C/C++语言实现状态机编程的方式有很多,本篇先来介绍最简单最容易理解的switch-case方法。...,则拆除成功;若密码错误,可以再次尝试输入密码 倒计时状态,若倒计时到0时,还没有拆除成功,则显示拆除失败 拆除成功或失败后,会再次回到初始状态,可重新开始玩 1.2 状态图 使用状态机思路进行编程...Bomb1_dispatch的参数形式,可以统一使用(Event *)类型,将TickEvt类型传入时,可以取其地址,再转为(Event *)类型,如下面实例代码loop函数使用;而在Bomb1...本篇先使用最简单最容易理解的switch-case方法,来实现状态机编程。 2.1 状态机处理 使用switch-case法实现状态机,一般需要两层switch结构。...演示视频: 4 总结 本篇以一个炸弹拆除的小游戏为例,介绍了嵌入式软件开发状态机编程的思路: 分析系统需要哪几种状态,哪几种事件 定义这些状态、事件,以及状态机的数据结构 使用UML建模,设计对应的状态图

24540

JavaScript与有限状态机

它对JavaScript的意义在于,很多对象可以写成有限状态机。 举例来说,网页上有一个菜单元素。鼠标悬停的时候,菜单显示;鼠标移开的时候,菜单隐藏。...如果使用有限状态机描述,就是这个菜单只有两种状态(显示和隐藏),鼠标会引发状态转变。...这要比回调函数、事件监听、发布/订阅等解决方案,逻辑上更合理,更易于降低代码的复杂度。 下面介绍一个有限状态机的函数库Javascript Finite State Machine。...该库提供一个全局对象StateMachine,使用该对象的create方法,可以生成有限状态机的实例。   ...Javascript Finite State Machine允许为每个事件指定两个回调函数,以warn事件为例: * onbeforewarn:warn事件发生之前触发。

92970

JavaScript switch case语句详解

JavaScript switch case语句详解 switch 语句专门用来设计多分支条件结构。与 else/if 多分支结构相比,switch 结构更简洁,执行效率更高。...switch 语句包含一个可选的 default 语句,如果在前面的 case 没有找到相等的条件,则执行 default 语句,它与 else 语句类似。...如果在函数中使用 switch 语句,可以使用 return 语句终止 switch 语句,防止代码继续执行。...2 : console.log("VIP会员"); break; case 3 : console.log("管理员"); break; } 示例2 在下面代码JavaScript 先检测 case... switch 结构内,先使用 case 枚举 4 种可预知的算术运算,当然还可以继续扩展 case 子句,枚举所有可能的操作,但是无法枚举所有不测,因此最后使用 default 处理意外情况。

34110
领券