Автор: Николай Павлин · «Павлин Шарит — ИТ вместе с Николаем Павлиным»
Поле status отвечает на вопрос, в каком состоянии находится заказ сейчас. Оно не объясняет, какие состояния были допустимы раньше, куда заказ может перейти дальше и что должно произойти при переходе.
Николай Павлин показывает, как вынести эти правила в конечный автомат с помощью Python-библиотеки python-statemachine. Состояния и переходы объявляются отдельно, недопустимые изменения блокируются библиотекой, а действия и условия можно привязать к конкретным переходам жизненного цикла.
Вместо проверок, распределённых по обработчикам и сервисам, получается одна модель процесса. На ней видно, что созданный заказ можно оплатить, оплаченный — передать в обработку, а попытка перескочить через обязательный этап должна завершиться ошибкой. Эту же структуру можно экспортировать в диаграмму и обсуждать не только с разработчиками.
Кому смотреть: Python-разработчикам, у которых правила изменения статуса сущности начали повторяться в разных частях приложения.
Из этого можно взять в работу: выбрать одну сущность с полем status и выписать разрешённые переходы между значениями. Если список нельзя составить без чтения нескольких сервисов, жизненный цикл уже заслуживает отдельной модели.
Первый пример построен вокруг заказа. Состояния объявляются через State, одно из них отмечается как начальное, а переходы связывают только допустимые пары. Вызов события изменяет текущее состояние автомата. Если переход из него не определён, библиотека выбрасывает ошибку вместо молчаливого присваивания нового значения.
Бизнес-логику можно привязать ко входу в состояние. Метод наподобие on_enter_processing выполняется, когда заказ переходит в обработку. Во втором примере, с кондиционером, автор добавляет условие: переход разрешается только тогда, когда соответствующий метод возвращает положительный результат.
Отдельно показана связь автомата с внешним объектом. Это важно для реального приложения, где заказ уже существует в базе и имеет сохранённый статус. Автомат должен начать работу с этого состояния, а результат перехода — вернуться в модель хранения.
В конце структура экспортируется в DOT-граф. На диаграмме видны состояния и направления переходов, поэтому она может служить не только иллюстрацией к коду, но и описанием процесса для поддержки и смежных команд.
Конечный автомат нужен не каждому полю с несколькими значениями. Для простого независимого переключателя он добавит лишнюю абстракцию. Польза появляется там, где порядок переходов, условия и побочные действия уже являются частью бизнес-правил.