前言
本篇文章本来是单纯的笔记总结,但是心中疑问很多,于是尝试自己解决,以下全部是个人理解,深知自己理论知识(软件工程)不过硬,欢迎指正,多多交流。
正文
有限状态机—逻辑单元内部处理方式
很早就听过状态机的大名,以为高深莫测,其实它也很平易近人,我们通过有限状态机这个模型,来进行业务逻辑处理。
在学习计算机网络时,用有线状态机来描述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++的???