Что такое конечный автомат (FSM) и в каких задачах он применяется

Ответ

Конечный автомат (Finite State Machine, FSM) — это математическая модель вычислений и поведенческий паттерн проектирования. Объект, реализующий FSM, может находиться в одном из строго определённого набора состояний и менять их в ответ на внешние события (входные данные).

Ключевые компоненты FSM:

  • Состояния (States): Конечное множество состояний, в которых может находиться система (например, IDLE, PROCESSING, COMPLETED).
  • Начальное состояние (Initial State): Состояние, в котором автомат находится при запуске.
  • События (Events/Inputs): Внешние воздействия, которые могут вызвать смену состояния.
  • Переходы (Transitions): Правила, которые определяют, в какое новое состояние перейдет автомат из текущего состояния при получении определённого события.

Пример реализации на Python (с таблицей переходов):

Этот подход более масштабируемый, чем множество if/elif.

from enum import Enum, auto

class State(Enum):
    LOCKED = auto()
    UNLOCKED = auto()

class Event(Enum):
    COIN_INSERTED = auto()
    PUSHED = auto()

class TurnstileFSM:
    def __init__(self):
        self.state = State.LOCKED
        # Таблица переходов: (текущее_состояние, событие) -> новое_состояние
        self.transitions = {
            (State.LOCKED,   Event.COIN_INSERTED): State.UNLOCKED,
            (State.LOCKED,   Event.PUSHED):        State.LOCKED, # Действие не меняет состояние
            (State.UNLOCKED, Event.PUSHED):        State.LOCKED,
            (State.UNLOCKED, Event.COIN_INSERTED): State.UNLOCKED # Действие не меняет состояние
        }

    def handle_event(self, event: Event):
        current_transition = (self.state, event)
        if current_transition in self.transitions:
            self.state = self.transitions[current_transition]
            print(f"Event '{event.name}' -> New state: {self.state.name}")
        else:
            print(f"Invalid event '{event.name}' for state '{self.state.name}'")

# Использование
turnstile = TurnstileFSM()
print(f"Initial state: {turnstile.state.name}")

turnstile.handle_event(Event.PUSHED)        # -> Invalid event... (или остается LOCKED)
# -> Event 'PUSHED' -> New state: LOCKED
turnstile.handle_event(Event.COIN_INSERTED) # -> New state: UNLOCKED
turnstile.handle_event(Event.PUSHED)        # -> New state: LOCKED

Области применения:

  • Управление состоянием заказа в e-commerce: созданоплаченв_доставкедоставлен / отменен.
  • Парсеры и лексические анализаторы: Разбор текста или кода по определённым правилам.
  • UI/UX: Управление состояниями компонентов интерфейса (например, загрузка, отображено, ошибка).
  • Сетевые протоколы: Обработка жизненного цикла соединения (TCP: LISTEN, SYN-SENT, ESTABLISHED).
  • Боты и диалоговые системы: Управление потоком диалога с пользователем (например, в aiogram.fsm).