Что такое конечный автомат (State Machine)?

«Что такое конечный автомат (State Machine)?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

  1. Состояния (States): Определённые конфигурации системы (например, IDLE, PROCESSING, SUCCESS, ERROR).
  2. Переходы (Transitions): Правила, определяющие, как и при каких событиях система переходит из одного состояния в другое.
  3. События (Events): Внешние или внутренние триггеры, вызывающие проверку условий для перехода.
  4. Действия (Actions): Операции, которые могут выполняться при входе в состояние, выходе из него или во время перехода.

Пример (упрощённый загрузчик):

// Определение состояний и переходов
const states = {
  IDLE: { on: { FETCH: 'LOADING' } },
  LOADING: {
    on: {
      SUCCESS: 'LOADED',
      ERROR: 'FAILED'
    }
  },
  LOADED: {},
  FAILED: { on: { RETRY: 'LOADING' } }
};

// Использование
let currentState = 'IDLE';
function transition(event) {
  const nextState = states[currentState]?.on?.[event];
  if (nextState) {
    console.log(`Переход из ${currentState} в ${nextState} по событию ${event}`);
    currentState = nextState;
  }
}
// IDLE -> FETCH -> LOADING -> SUCCESS -> LOADED
transition('FETCH');
transition('SUCCESS');

Преимущества:

  • Ясность: Поведение системы становится явным и легко визуализируемым (диаграммы состояний).
  • Надёжность: Исключаются недопустимые переходы и состояния.
  • Лёгкость тестирования: Все сценарии можно описать как последовательности состояний и событий.

Применение: UI-компоненты (кнопки, формы), бизнес-процессы (заказ товара), парсеры, сетевые протоколы.