状态机编程基本原理

来源:互联网 发布:js如何获取style属性 编辑:程序博客网 时间:2024/05/22 12:16
近期在用IBM的RSARTE进行状态机编程。
才开始接触时,有些抵触,觉得不好(实)用,不如直接写代码来的直接。
熟悉了一段时间工具之后,发现比想象中的好,感觉业务流程特别清晰。我想最大的好处是便于后期维护,其它人接手代码后不用抓破头皮去理解逻辑。
总的来说:多了解一种编程方式,多一种思路,多一分对编程的理解。

再说说自己的一些理解:
状态机编程首先考虑的还是面向对象,要构造哪些类,建立哪些类关系。
状态机基于类来创建,一个类是否需要状态机需要考虑周到,小类、逻辑简单的类不需要状态机。
状态机状态的转换是由消息(信号)来驱动,消息的接收、转发需要规划好,不然消息多了就乱了。

我在下面的代码中对状态机编程做了精简,针对状态机编程的几个“关键词”做了说明,透过代码,发现状态机比想象中low的多。
1. State; 2. Effect; 3. Guard; 4. Trigger

下面是对应的代码,通过 g++ -g stateMaching.cpp 可直接编译、执行、debug。

#include<iostream>using namespace std;class StateMachine{public:  //State,图中的2种状态,占的位置最大,代码最少,state就是2个标志位  enum MachineStateE  {    WORKING_STATE,   //也可以是 INITIAL_STATE,    SLEEPING_STATE  };  StateMachine( void )  {    init();  }  virtual ~StateMachine( void )  {    cout<<"Destructor: Release state machine"<<endl;  }  //Trigger,就是一个函数名最后带T的函数;所谓的消息驱动,就是调用函数  void sleepingT( void )  {    //每次进入状态机之前,检查当前状态,然后进入当前状态处理;函数退出之前判断是否需要改变状态    // 如果进入了不该进入的状态,就应该报Error    unsigned char state = sm_state;    switch( state )    {      case WORKING_STATE:        if(checkStatus()) //Guard,就是调用一个返回为bool型的函数        {          {            cout<<"Effect: from working to sleeping"<<endl;  //Effect,进入一个状态前函数中必走的代码          }          sm_state = SLEEPING_STATE; //每次执行完后改变状态          return ;        }        //Guard 失败, 直接 return, 状态不改变    return ;      case SLEEPING_STATE:        {        cout<<"Effect: from sleeping to sleeping"<<endl;  //Effect        }        sm_state = SLEEPING_STATE;  //SLEEPING_STATE 到 SLEEPING_STATE ,保持原状态        return ;      default:        return ;    }  }  //Trigger  void workingT( void )  {    unsigned char state =sm_state;    switch( state )    {      case WORKING_STATE:        {          cout<<"Effect: from working to working"<<endl;        }        sm_state = WORKING_STATE;        return ;      case SLEEPING_STATE:        if(checkStatus()) //Guard        {          {          cout<<"Effect: from sleeping to working"<<endl;          }          sm_state = WORKING_STATE;          return ;        }        //Guard failed, state is not Changed.        return ;      default:        return ;    }  }  //添加一个Operation,就是添加一个普通的函数  bool checkStatus( void )  {  return true;  }  private:   //添加一个Attribute,就是添加一个普通的变量   unsigned char sm_state;   //初始化,赋予状态机一个初始态:WORKING_STATE   void init( void )   {   {   cout<<"Effect: Init state machine"<<endl;   }   sm_state = WORKING_STATE;   }};int main(){  StateMachine *sm_p = new StateMachine;    //Trigger的调用,本质就是调用函数  sm_p->workingT();  sm_p->sleepingT();  sm_p->sleepingT();  sm_p->workingT();  delete sm_p;}



原创粉丝点击