【网络编程】用有限状态机来处理业务逻辑

来源:互联网 发布:电子书杂志制作软件 编辑:程序博客网 时间: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++的???

原创粉丝点击