oop - 你会如何给洗衣机编码?

标签 oop state-machine

想象一下,我有一个代表简单洗衣机的类。它可以按以下顺序执行以下操作:打开 -> 洗涤 -> 离心机 -> 关闭 .我看到两个基本的选择:

  • 我可以有一个带有方法的类 WashingMachine turnOn(), 洗涤(int minutes), 离心机(int revs), turnOff()。 问题在于界面没有说明正确的操作顺序。如果客户在机器打开之前尝试离心,我充其量只能抛出 InvalidOperationException。我还可以使用一个单独的程序类,它将离心机转速和洗涤时间传递给 WashingMachine,并简化这些方法。
  • 我可以让类本身处理正确的转换并使用单一方法 下一个操作() .另一方面,这个问题是语义很差。客户端在调用 nextOperation() 时将不知道会发生什么。想象一下,您实现了离心机按钮的点击事件,因此它调用了 nextOperation()。用户在机器启动后按下离心机按钮并启动!机器开始洗涤。我可能需要我的类上的一些属性来参数化操作,或者可能需要一个带有washLength 和 centrifugeRevs 字段的单独程序类,但这并不是真正的问题。

  • 哪个替代方案更好?或者也许还有其他更好的选择,我错过了描述?

    最佳答案

    我会有一个“高级”State Machine控制每个状态的进入/运行/退出的类(其中状态可以是“填充”、“洗涤”、“漂洗”、“清空”、“甩干”等)

    制定State Transition Diagram您需要的所有州,包括(对于每个州)

  • 入境前有什么要求(入境条件)
  • 进入状态时需要发生什么(进入操作)
  • 状态期间发生的事情(任务本身)
  • 出国前有什么要求(退出条件)
  • 退出状态时会发生什么(退出操作)

  • 您可能需要也可能不需要进入/退出条件(例如,在某些情况下,您可以通过进入/退出操作强制条件)。但出于安全原因,某些条件可能是好的(例如,退出“待机”状态或进入“危险”状态,如甩干)

    您还可以创建 Transitions ,它定义了状态之间的联系。有一个过渡
  • “来自”状态
  • 一个“到”状态
  • 过渡条件(过渡会发生吗?
  • 过渡 Action (过渡时需要发生的事情)

  • 同样,您可能不需要所有这些,并且许多转换将仅指定“从”和“到”状态。

    在这两种情况下,尽量保留每个 StateTransition尽可能简单(尽量将条件/ Action 放在最有意义的地方,显然,由于通用设计,StateTransition 中可能会同时定义这些条件/ Action )

    此时应该很明显,您可以制作一个相当通用的 State包含所有这些东西的抽象/可重载函数的类,同样适用于 Transition类(class)。 State Machine类可以根据需要调用这些成员函数中的每一个,基于它请求的转换。

    如果你让它特别通用,那么 StatesTransitions可通过 State Machine 注册在施工时,或者您可能只编码 State Machine将它们全部包含在内。

    然后,您可以从状态内部请求转换(即特定状态可以知道它何时结束,并知道接下来要进入哪个状态),或者您可以拥有一个控制状态转换的外部类(每个状态都非常简单,纯粹照顾自己的行为,外部类决定转换的顺序和时间)。

    根据我对这些事情的经验,最好将每个 Action 的故意顺序/定时的高级逻辑和对某些硬件事件的 react 的低级逻辑分开(例如,当水位时从“填充”状态转换出来)到达了)。

    不过,这是一个非常通用的设计,您可以通过多种不同的方式实现完全相同的功能——很少有一种正确的做事方式......

    关于oop - 你会如何给洗衣机编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3067053/

    相关文章:

    C++ 将结构传递给函数

    c# - 面向对象的概念适用于C语言吗?

    c - 有限状态机代码在 µC 中属于什么位置?

    python - 如何从 Catch 状态的前一个函数访问 Step Function 中的错误信息

    java - 如何用 Java 创建有限状态机

    PHP oop 如何以更简单的方式调用另一个类方法?

    java - 在运行时使用附加信息增强 Java 中现有数据结构的设计模式

    python - AWS - Step 函数,在 TuningStep 中使用执行输入

    VHDL 状态机差异(用于综合)

    ruby - 如何检查类是否正确实例化