Создание автомата
В lite-fsm автоматы создаются из отдельных логических компонентов: конфигурации, начального состояния, контекста, редьюсера и эффектов. Такой модульный подход улучшает организацию кода и упрощает тестирование.
Разбиение автомата на части
В lite-fsm вы можете разбить определение автомата на логические компоненты, что значительно упрощает его поддержку и понимание. Это дополнительная возможность библиотеки, которая особенно полезна для сложных автоматов с множеством состояний и переходов. В большинстве случаев можно определять автомат как единое целое, но возможность модульного определения дает гибкость при работе со сложными системами.
Пример использования
Вместо того чтобы определять весь автомат в одном месте, вы можете выделить отдельные части:
JavaScript
// Конфигурация состояний и переходов
const config = createConfig({
IDLE: {
CHANGE_TRACK: "LOAD_TRACK_META_PENDING",
},
LOAD_TRACK_META_PENDING: {
LOAD_TRACK_META_RESOLVE: "LOAD_STREAMS_PENDING",
},
LOAD_STREAMS_PENDING: {
LOAD_STREAMS_RESOLVE: "SELECT_STREAM_PENDING",
},
SELECT_STREAM_PENDING: {
SELECT_STREAM_RESOLVE: "SET_STREAM_PENDING",
},
SET_STREAM_PENDING: {},
});
// Начальное состояние и контекст
const initialState = "IDLE";
const initialContext = {
// начальные данные
};
// Определение редьюсера
const reducer = (s, action, { nextState }) => {
s.state = nextState;
// логика обновления контекста
return s;
};
// Определение эффектов
const effects = {
// эффекты для разных состояний
};
// Создание автомата из компонентов
export const player = createMachine({
config,
initialState,
initialContext,
reducer,
effects,
});Преимущества композиции
- Улучшенная читаемость - разбивка на логические компоненты делает код более понятным
- Упрощенное тестирование - можно тестировать отдельные части автомата изолированно
- Лучшая организация кода - каждая часть автомата имеет свое специализированное назначение
- Переиспользование - отдельные части можно переиспользовать в разных автоматах
Структура файлов для сложных случаев
Важно отметить, что разделение автомата на отдельные файлы — это скорее возможность, а не универсальная рекомендация. В большинстве случаев лучше стараться держать автомат в одном месте как единую модель и разделять его только при необходимости или когда логика уже сильно разрослась.
Как правило, эффективнее разделять бизнес-логику по разным автоматам с чёткими зонами ответственности. При таком подходе отдельные автоматы не так быстро разрастаются, и необходимость в их фрагментации на отдельные файлы возникает реже.
Однако, если автомат всё же стал слишком сложным, для его организации можно использовать следующую структуру:
/machines
/player
index.ts // Экспорт автомата
types.ts // Типы и интерфейсы
config.ts // Конфигурация состояний
reducer.ts // Логика обновления состояния
effects.ts // Эффекты для состояний
constants.ts // Константы (имена состояний, событий)
selectors.ts // Селекторы для получения данных из состояния
/auth
// аналогичная структура
/cart
// аналогичная структураТакой подход может быть полезен для очень сложных автоматов, но не должен применяться преждевременно.