Dan*_*Dan 11 oop state-machine
想象一下,我有一个代表简单洗衣机的课程.它可以按以下顺序执行以下操作:打开 - >清洗 - >离心 - >关闭.我看到两个基本的选择:
我可以使用方法turnOn(),wash(int minutes),离心(int revs),turnOff()等方法使用WashingMachine类.这个问题是接口没有说明正确的操作顺序.如果客户端在打开机器之前尝试离心,我最多可以抛出InvalidOprationException.我还可以使用separete程序类,它将离心机转速和洗涤分钟传递给WashingMachine并简化这些方法.
我可以让类本身处理正确的转换并使用单个方法nextOperation().另一方面,问题在于语义很差.客户端不知道调用nextOperation()时会发生什么.想象一下,您实现了离心机按钮的单击事件,因此它调用nextOperation().打开机器后,用户按下离心机按钮!机器开始洗了.我可能需要在我的类上使用一些属性来参数化操作,或者可能需要一个带有washLength和centrifugeRevs字段的单独的Program类,但这不是真正的问题.
哪种选择更好?或者也许还有一些我错过的其他更好的选择?
drf*_*lat 15
我有一个'高级' State Machine课程,控制每个州的进入/运行/退出(状态可能是'填充','洗','冲洗','清空','旋转干'等等) )
绘制所需状态的状态转换图,包括(对于每个州)
您可能需要也可能不需要进入/退出条件(例如,您可以在某些情况下强制执行进入/退出操作的条件).出于安全原因,一些条件可能是好的(例如退出'待机'状态或进入'危险'状态,如旋转干燥)
您还可以创建Transitions,用于定义状态之间的链接.转型了
同样,您可能不需要所有这些,并且许多转换将仅指定"从"和"到"状态.
在这两种情况下,尽量保持每个State和Transition简单,因为它需要为(尽量把条件/他们最有意义的行动,显然有这些潜在翻倍的来定义State 和一个Transition通用的,因为设计)
在这一点上应该非常明显,你可以创建一个相当通用的State类,其中包括所有这些东西的抽象/可重载函数,同样也适用于Transition类.在State Machine根据需要,基于所请求的它的转换的类可以调用每个这些成员函数.
如果你使它特别通用,那么States和Transitions可以State Machine在施工时注册,或者你可能只是编码State Machine以包含所有.
然后,您可以从状态内请求转换(即,特定状态可以知道它何时结束,并知道下一个状态)或者您可以拥有一个控制状态转换的外部类(每个状态都非常简单) ,纯粹照顾自己的行为,外部阶级决定过渡的顺序和时间).
根据我对这些事情的经验,将每个动作的故意顺序/时间的高级逻辑与对某些硬件事件的反应的低级逻辑分开是个好主意(例如,当水位过渡到"填充"状态时到达了).
这是一个非常通用的设计,你可以通过一系列不同的方式实现完全相同的功能 - 很少有一种 正确的做事方式......
我认为turnOn()、Wash()、centerfuge()等应该是私有/受保护的方法。公共接口应该是doTheWash(WashMode mode)。洗衣机本身知道它支持的模式以及如何使它们工作,洗衣机的用户不需要参与操作的顺序或持续时间。期望洗衣机类的作者以合理的顺序调用私有方法是合理的。