Ответ
Конечный автомат (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).