想象一下,我有一个代表简单洗衣机的类。它可以按以下顺序执行以下操作:打开 -> 洗涤 -> 离心机 -> 关闭 .我看到两个基本的选择:
哪个替代方案更好?或者也许还有其他更好的选择,我错过了描述?
最佳答案
我会有一个“高级”State Machine
控制每个状态的进入/运行/退出的类(其中状态可以是“填充”、“洗涤”、“漂洗”、“清空”、“甩干”等)
制定State Transition Diagram您需要的所有州,包括(对于每个州)
您可能需要也可能不需要进入/退出条件(例如,在某些情况下,您可以通过进入/退出操作强制条件)。但出于安全原因,某些条件可能是好的(例如,退出“待机”状态或进入“危险”状态,如甩干)
您还可以创建
Transitions
,它定义了状态之间的联系。有一个过渡同样,您可能不需要所有这些,并且许多转换将仅指定“从”和“到”状态。
在这两种情况下,尽量保留每个
State
和 Transition
尽可能简单(尽量将条件/ Action 放在最有意义的地方,显然,由于通用设计,State
和 Transition
中可能会同时定义这些条件/ Action )此时应该很明显,您可以制作一个相当通用的
State
包含所有这些东西的抽象/可重载函数的类,同样适用于 Transition
类(class)。 State Machine
类可以根据需要调用这些成员函数中的每一个,基于它请求的转换。如果你让它特别通用,那么
States
和 Transitions
可通过 State Machine
注册在施工时,或者您可能只编码 State Machine
将它们全部包含在内。然后,您可以从状态内部请求转换(即特定状态可以知道它何时结束,并知道接下来要进入哪个状态),或者您可以拥有一个控制状态转换的外部类(每个状态都非常简单,纯粹照顾自己的行为,外部类决定转换的顺序和时间)。
根据我对这些事情的经验,最好将每个 Action 的故意顺序/定时的高级逻辑和对某些硬件事件的 react 的低级逻辑分开(例如,当水位时从“填充”状态转换出来)到达了)。
不过,这是一个非常通用的设计,您可以通过多种不同的方式实现完全相同的功能——很少有一种正确的做事方式......
关于oop - 你会如何给洗衣机编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3067053/