f4.*_*f4. 8 c++ language-agnostic state-machine
有限状态机通常被认为是OOP中的糟糕设计吗?
我听到了很多.并且,在我不得不使用一个非常古老的,没有文档的C++片段之后,我倾向于同意.调试很痛苦.
可读性/可维护性问题呢?
pes*_*669 19
FSM永远不应该被认为是坏的.它们太有用了,但是那些不习惯它们的人会经常认为它们很麻烦.
有许多方法可以用OOP实现一个.有些比其他人更丑.你的低级别人员会使用switch语句,跳转表甚至"转到".
如果您正在寻找一种更简洁的方法,我建议使用Boost的状态图表库,该库仅用于在C++中实现UML状态图.它利用现代模板技术,使事物更具可读性.它也表现得很好.
有限状态机是实现某种目的的工具.作为任何工具,它们也可能被滥用.
它们并不是最优雅的工具,但是它们擅长的工作几乎不可能通过其他方式实现(通常任何其他方法都注定要比机器差几千倍).
这项工作是在禁止经典等待状态的条件下运作的.
我必须阅读触摸屏.为了读取位置,我必须通过SPI交换大约15个命令.我需要一秒钟好100次读数.我必须在每个命令后等待大约1微秒,因为各个忙碌的旗帜在我继续之前消失.还需要在同一界面上实现许多其他操作,例如设置对比度,更改模式,打开或关闭背光,读取温度.如果我while(BUSY_BIT);为每次等待执行,我会在瞬间吃掉所有CPU.如果我这样做sched_yield()还是usleep(1),我永远不会达到我想要读出的数量.唯一的方法是有限状态机.
但是有一些方法可以使有限状态机也发挥得很好.在幕后隐藏机器并为开发人员提供使用的功能.
到目前为止,我的工作经验主要是基于3种不同的有限状态机的2个系统.
如果在结构上或顺序编写,代码将简单两倍,清晰三倍.除非它不起作用,否则将与糟糕的表现一起工作.
无法告诉你他们说什么.
但OO和FSM sorta攻击不同的问题域.在对象正在交互的域中 - 这需要面向对象的方法.在世界处于某种状态的领域 - 需要FSM设计.
实际上,您可以将这些设计与不同的抽象级别混合使用,这将比仅使用其中一个更清晰.