【网络编程】用有限状态机来处理业务逻辑
来源:互联网 发布:电子书杂志制作软件 编辑:程序博客网 时间:2024/06/03 18:16
前言
本篇文章本来是单纯的笔记总结,但是心中疑问很多,于是尝试自己解决,以下全部是个人理解,深知自己理论知识(软件工程)不过硬,欢迎指正,多多交流。
正文
有限状态机—逻辑单元内部处理方式
很早就听过状态机的大名,以为高深莫测,其实它也很平易近人,我们通过有限状态机这个模型,来进行业务逻辑处理。
在学习计算机网络时,用有线状态机来描述TCP协议:
这样显得很清楚,当我们写逻辑处理的代码,(就if-else switch-case)这样子的代码,如果我们能用一个有限状态机来描述,这样编写的代码就非常的清晰,程序的可维护性也变得更好了。
正如名字一样,我们的程序将具有有限的状态,每时刻的状态都是唯一确定的,在事件发生之后,程序由当前状态转换到另一种状态。
看到这里,也许你会想到,这TM和流程图有毛区别。
是的,此刻我就是这么想的。
所以,让我们用一个实际例子来说明吧。
情景:
康康去东区食堂,决定吃黄焖鸡,但是今天是新来的小姐姐,不会叫号,于是康康每隔一段时间就要去看看鸡做好没有,等待过程中,康康掏出手机给妹子讲C++。
那么我们通过流程图(左图)以及有限状态机(右图)来比较看看
好像也没什么区别。。。
那么就来看看代码,首先是流程图的逻辑:
int kangkang_eat_chicken(){ if(order_chicken() == true){ while(1){ if(look_chicken() == true){ eat_chicken(); return true; }else play_phone(); } }else { buy_other(); eat_other(); return true; }
然后是有限状态机:
int kangkang_eat_chicken(){ while(1){ switch(state){ case ORDER: if(order_chicken() == true) { state = LOOK; break; }else { state = OTHER; break; } case LOOK: if(look_chicken() == true){ state = EAT; break; }else{ state = PHONE; break; } case PHONE: play_phone(); state = LOOK; break; case OTHER: buy_other(); state = EAT; case EAT: eat(); return true; } }}
好像真的没有什么区别,
但当我们的逻辑处理需要更改时,差别就出现了
场景发生了一点变化:
康康出门前没有给手机充电,手机电不多了,康康不想耽误和妹子聊天的大好机会,于是决定当手机没电时,直接买个馍吃,尽快回去给手机充电,然后和妹子聊。
这时我们就要在原来的代码上进行修改
int kangkang_eat_chicken(){ if(order_chicken() == true){ while(1){ if(look_chicken() == true){ eat(); return true; }else if(play_phone() == NO_POWER){ buy_other(); eat(); return true; } } }else { buy_other(); eat(); return true; }}
而如果在有限状态机上修改
int kangkang_eat_chicken(){ while(1){ switch(state){ case ORDER: if(order_chicken() == true) { state = LOOK; break; }else { state = OTHER; break; } case LOOK: if(look_chicken() == true){ state = EAT; break; }else{ state = PHONE; break; } case PHONE: if(play_phone() == NO_POWER){ state = OTHER; }else state = LOOK; break; case OTHER: buy_other(); state = EAT; case EAT: eat(); return true; } }}
可以看到,原先的流程上直接进行修改效果并不好,逻辑不清晰,代码显得很臃肿,简而言之,Ugly!。
而使用有限状态机,我们的修改很简洁,逻辑也很清晰,代码可扩展性强。
所以,在处理业务逻辑时,使用有限状态机这样的模式,也许会有更好的效果。
后记
本文例子纯属虚构,哪有给妹子讲C++的???
- 【网络编程】用有限状态机来处理业务逻辑
- php中,控制器如何调用模型来处理业务逻辑?
- 业务逻辑处理顺序
- ADD业务处理逻辑
- JDBC业务处理逻辑
- 轻量级业务逻辑处理框架
- 使用Servlet处理业务逻辑
- 编程内功:业务逻辑抽象
- 策略型业务逻辑处理选择
- 策略型业务逻辑处理选择
- 处理积分加现金支付业务逻辑
- 消息推送业务逻辑处理 “MessageUI”
- 审核对应的业务逻辑处理
- 关于一些业务逻辑的处理技巧
- 多线程处理list业务逻辑(大数量)
- 多线程处理耗时的业务逻辑
- 有限状态机编程
- 编程常见处理逻辑
- BeautifulSoup与正则_简单爬虫python3实现
- 一个java接口实例
- 欢迎使用CSDN-markdown编辑器
- 课本NP-complete证明题
- 两数组的交 II
- 【网络编程】用有限状态机来处理业务逻辑
- 神经网络浅讲:从神经元到深度学习
- Mybatis的动态sql语句if和choose
- arcEngine部分hignlight刷新问题
- Object类的方法
- 【思维导图】数据库知识框架
- 处理ViewPager嵌套RecycleView卡顿问题
- 575. Distribute Candies
- Eclipse中导入外部jar包