状态机编程基本原理
来源:互联网 发布:js如何获取style属性 编辑:程序博客网 时间:2024/05/22 12:16
近期在用IBM的RSARTE进行状态机编程。
才开始接触时,有些抵触,觉得不好(实)用,不如直接写代码来的直接。
熟悉了一段时间工具之后,发现比想象中的好,感觉业务流程特别清晰。我想最大的好处是便于后期维护,其它人接手代码后不用抓破头皮去理解逻辑。
总的来说:多了解一种编程方式,多一种思路,多一分对编程的理解。
再说说自己的一些理解:
状态机编程首先考虑的还是面向对象,要构造哪些类,建立哪些类关系。
状态机基于类来创建,一个类是否需要状态机需要考虑周到,小类、逻辑简单的类不需要状态机。
状态机状态的转换是由消息(信号)来驱动,消息的接收、转发需要规划好,不然消息多了就乱了。
我在下面的代码中对状态机编程做了精简,针对状态机编程的几个“关键词”做了说明,透过代码,发现状态机比想象中low的多。
1. State; 2. Effect; 3. Guard; 4. Trigger
才开始接触时,有些抵触,觉得不好(实)用,不如直接写代码来的直接。
熟悉了一段时间工具之后,发现比想象中的好,感觉业务流程特别清晰。我想最大的好处是便于后期维护,其它人接手代码后不用抓破头皮去理解逻辑。
总的来说:多了解一种编程方式,多一种思路,多一分对编程的理解。
再说说自己的一些理解:
状态机编程首先考虑的还是面向对象,要构造哪些类,建立哪些类关系。
状态机基于类来创建,一个类是否需要状态机需要考虑周到,小类、逻辑简单的类不需要状态机。
状态机状态的转换是由消息(信号)来驱动,消息的接收、转发需要规划好,不然消息多了就乱了。
我在下面的代码中对状态机编程做了精简,针对状态机编程的几个“关键词”做了说明,透过代码,发现状态机比想象中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;}
阅读全文
0 0
- 状态机编程基本原理
- 状态机编程
- 状态机编程
- 状态机编程
- 状态机编程
- 状态机编程
- 状态机编程
- 状态机编程
- 状态机编程
- 状态机编程
- 状态机编程
- 状态机编程
- c语言状态机编程
- 状态机编程之我见
- 状态机编程思想
- 状态机编程1
- 状态机编程2
- 单片机 状态机编程
- RPC框架
- java实现微信红包分配改进
- 1096: 水仙花数(函数专题)
- 最全面git使用总结笔记
- 反编译apk加入jar包在重新打包签名的方法
- 状态机编程基本原理
- FlyDB
- URI 和 URL 的区别
- 1097: 计算平均成绩(函数专题)
- delphi Tservice类
- 最新HTML标签【长期更新】
- jvm垃圾收集器 以及 垃圾收集算法
- 面试题42:翻转单词顺序 VS 左旋转字符串
- ant+jmeter生成报告,发送邮件