为Linux应用构造有限状态机方法上3节能
2020-10-04 合山装修公司
使用switch语句实现的有限状态机的确能够很好地工作,但代码的可读性并不十分理想,主要原因是在实现状态之间的转换时,检查转换条件和进行状态转换都是混杂在当前状态中来完成的。例如,当城门处于Opened状态时,需要在相应的case中调用closeDoor()函数来检查是否有必要进行状态转换,如果是的话则还需要调用changeState()函数将当前状态阿黄哥哥要追上你了切换到Closed。显然,如果在每种状态下都需要分别检查多个不同的转换条件,并且需要根据检查结果让状态机切换到不同的状态,那么这样的代码将是枯燥而难懂的。从代码重构的角度来讲,此时更好的做法是引入checkStateChange()和performStateChange()两个函数,专门用来对转换条件进行检查,以应认定当事人属于抽逃出资行为及激活转换时所需要执行的各种动作。这样一来,程序结构将变得更加清晰: switch (state) { // 处理状态Opened的分支 case (Opened): { // 执行动作Open open(); // 检查是否有激发状态转换的事件产生 if (checkStateChange()) { // 对状态机的状态进行转换 performStateChange(); } break; } // 处理状态Closed的分支 case (Closed): { // 执行动作Close close(); // 检查是否有激发状态转换的事件产生 if (checkStateChange()) { // 对状态机的状态进行转换 performStateChange(); } break; } // 处理状态Locked的分支 case (Locked): { // 执行动作Lock lock(); // 检查是否有激发状态转换的事件产生 if (checkStateChange()) { // 对状态机的状态进行转换 performStateChange(); } break; } // 处理状态Unlocked的分支 case (Unlocked): { // 执行动作Lock unlock(); // 检查是否有激发状态转换的事件产生 if (checkStateChange()) { // 对状态机的状态进行转换 performStateChange(); } break; } }
但checkStateChange()和performStateChange()这两个函数本身依然会在面对很复杂的状态机时,内部逻辑变得异常臃肿,甚至可能是难以实现。 在很长一段时期内,使用switch语句一直是实现有限状态机的唯一方法,甚至像编译器这样复杂的软件系统,大部分也都直接采用这种实现方式。但之后随着状态机应用的逐渐深入,构造出来的状态机越来越复杂,这种方法也开始面临各种严峻的考验,其中最令人头痛的是如果状态机中的状态非常多,或者状态之间的转换关系异常复杂,那么简单地使用switch语句构造出来的状态机将是不可维护的。
安络化纤丸治疗肝硬化管用么严重腋臭用什么止汗婴儿拉肚子什么原因
-
-
恩惠魔术师坚称湖人全队毫不惧怕勇士盼西决相遇
魔术师坚称湖人全队毫不惧怕勇士 盼西决相遇魔术师北京时间7月20日,据美...
- 家装知识 2020-09-10
-
恩惠魔术师坚称湖人全队毫不惧怕勇士盼西决相遇
-
-
维斯塔潘暗示自己影响了红牛车手人选
维斯塔潘暗示自己影响了红牛车手人选维斯塔潘、塞恩斯,两人曾在小红牛车...
- 家装知识 2020-07-04
-
维斯塔潘暗示自己影响了红牛车手人选
-
-
节犯库里还在倒时差秒俩分是熟悉的味道搭配
节犯库里还在倒时差?秒俩分是熟悉的味道库里今天犯规有点儿多 北...
- 家装知识 2020-06-06
-
节犯库里还在倒时差秒俩分是熟悉的味道搭配
-
-
瑞士精英赛中国女排32擒美国头名进4强半搭配
瑞士精英赛中国女排擒美国头名进4强 半决赛战日本北京时间6月11日凌晨,激...
- 家装知识 2020-06-02
-
瑞士精英赛中国女排32擒美国头名进4强半搭配
-
-
米兰弃帅又找到工作啦重回意甲签下年合同搭配
米兰弃帅又找到工作啦!重回意甲 签下年合同蒙特拉出任佛罗伦萨新帅官方...
- 家装知识 2020-06-01
-
米兰弃帅又找到工作啦重回意甲签下年合同搭配
-
-
绿地兴景苑开始申购51套小户型拼手速搭配
绿地兴景苑开始申购 51套小户型拼手速2018年共有产权的供应真是几家欢喜几...
- 家装知识 2020-05-30
-
绿地兴景苑开始申购51套小户型拼手速搭配