状态机是什么?

引言: 学习Promise的时候反复看到一个术语"状态机",经学习并由ai润笔获得以下内容,供参考。

状态机的核心思想

状态机的核心思想就是 将行为的判断集中控制,并且通过明确的状态和状态之间的转换来管理系统的行为。

在传统的编程中,尤其是有多个状态的系统,往往会在代码中出现很多条件判断(如 if-elseswitch)来决定当前状态下应该执行什么操作。而使用状态机的方式,我们将这些条件判断集中管理,通常通过一种结构化、明确的方式来定义每个状态及其可能的行为和转换规则。

核心概念

  1. 状态 :系统可以处于的不同状态(例如,PendingPaidShippedDelivered)。
  2. 状态转换 :从一个状态到另一个状态的转移(例如,从 PendingPaid,从 PaidShipped)。
  3. 行为 :当系统处于某个状态时,它执行的操作或行为(例如,当订单状态是 Paid 时,系统可以触发发货操作)。
  4. 状态机的作用:通过控制和管理状态之间的转换规则和行为,使得状态管理变得清晰、统一、可扩展。

为什么状态机有效?

  1. 集中控制行为

    • 所有的状态和行为都被集中管理,你不再需要在程序中到处写 if-elseswitch 语句来判断当前状态。
    • 每个状态下的行为都被明确地定义在状态机中,这样代码更加清晰,易于理解。
  2. 避免重复和错误的状态转换

    • 状态机强制规定了合法的状态转移规则,确保状态的转换是符合逻辑的,不会发生错误的转换(比如从 Shipped 直接跳到 Paid)。
    • 这种约束减少了逻辑错误和意外的行为。
  3. 易于扩展

    • 随着系统的需求变化,你可以很容易地添加新的状态、状态转换和行为,只需修改状态机的配置,而不需要在代码的各个地方修改判断逻辑。
    • 增加一个新的状态和转换规则不需要重构原有代码,极大地提高了系统的可维护性和可扩展性。
  4. 可预测和清晰的状态流

    • 状态机使得系统的状态变化具有可预测性,每个状态都有明确的转换规则,开发者可以很容易地了解和调试系统在每个状态下的行为。
    • 例如,系统在 Shipped 状态时一定会做某件事(比如通知用户发货),而在 Paid 状态时则会做另一件事。

举个简单的例子

假设你有一个 电梯 系统,它有以下几个状态:

  • Idle(空闲)
  • MovingUp(向上移动)
  • MovingDown(向下移动)
  • DoorOpen(门打开)

如果不使用状态机,你可能会在每个操作中写很多 if 语句来判断当前电梯的状态,并决定执行什么操作。

传统做法:

javascript 复制代码
if (currentState === "Idle") {
  // 执行启动电梯上升的逻辑
} else if (currentState === "MovingUp") {
  // 执行电梯移动上的逻辑
} else if (currentState === "DoorOpen") {
  // 执行打开电梯门的逻辑
}

这种方式容易导致逻辑混乱,特别是当状态增多时,代码会变得越来越复杂。

使用状态机:

javascript 复制代码
class Elevator {
  constructor() {
    this.state = "Idle"; // 电梯初始状态
  }

  // 移动电梯
  moveUp() {
    if (this.state === "Idle") {
      console.log("电梯正在上升");
      this.state = "MovingUp";
    } else {
      console.log("电梯无法上升,当前状态:", this.state);
    }
  }

  moveDown() {
    if (this.state === "Idle") {
      console.log("电梯正在下降");
      this.state = "MovingDown";
    } else {
      console.log("电梯无法下降,当前状态:", this.state);
    }
  }

  openDoor() {
    if (this.state === "Idle") {
      console.log("电梯门已打开");
      this.state = "DoorOpen";
    } else {
      console.log("电梯无法打开门,当前状态:", this.state);
    }
  }

  getState() {
    return this.state;
  }
}

这种方式的优势

  • 集中控制 :所有的状态判断都集中在 Elevator 类的函数内部。每个函数负责一种状态的转换和行为,没有冗余的 if-else
  • 避免错误的状态转换 :电梯不会在 MovingUpMovingDown 状态下尝试打开门,也不会在打开门时尝试移动。每个状态都有明确的转换规则,避免了不合理的操作。
  • 易于扩展 :假设我们增加一个新的 Maintenance(维护)状态,只需要在状态机中添加新的状态和规则,而不需要更改原有的代码逻辑。

总结

状态机本质上是通过将多个状态和这些状态下的行为集中管理,使得代码更加清晰、可预测、易于扩展。它将系统的状态转换逻辑显式化,减少了潜在的错误,同时避免了冗余的判断代码。特别是在处理复杂的系统、状态之间有复杂转换的场景下,状态机是一个非常有效的工具。

相关推荐
东东23334 分钟前
GeoJSON 介绍:Web 地图数据的通用语言
前端·javascript·json
Tzarevich35 分钟前
JavaScript 原型链:理解对象继承的核心机制
javascript·promise
亮子AI36 分钟前
【Javascript】jsondiffpatch检测到子节点改变了,父节点会标记为改变吗?
开发语言·前端·javascript
T___T1 小时前
写着写着,就踩进了 JavaScript 的小坑
前端·javascript·面试
ERP老兵-冷溪虎山1 小时前
Python/JS/Go/Java同步学习(第五十篇半)四语言“path路径详解“对照表: 看完这篇定位文件就通透了(附源码/截图/参数表/避坑指南)
java·javascript·python·golang·中医编程·编程四语言同步学·path路径详解
顾安r1 小时前
11.29 脚本游戏 单页面格斗游戏模板
前端·javascript·css·游戏·virtualenv
我叫张小白。1 小时前
Vue3 路由:单页面应用的核心引擎
前端·javascript·vue.js·前端框架·vue3
天空陪伴星辰a2 小时前
表单校验问题
前端·javascript·表单校验
鱼鱼块2 小时前
《最小栈的巧妙设计:用辅助栈实现 O(1) 获取最小值》
javascript·算法·面试
San302 小时前
反转字符串与两数之和:两道简单题背后的 JavaScript 思维深度
javascript·算法·面试