Перейти к содержанию

Что такое конечные автоматы и диаграммы состояний?

Конечные автоматы помогают моделировать, как процесс переходит из одного состояния в другое при наступлении события.

Конечные автоматы полезны в разработке программного обеспечения, потому что они помогают зафиксировать все состояния, события и переходы между ними. Использование конечных автоматов упрощает поиск невозможных состояний и выявление нежелательных переходов.

Конечные автоматы моделируют логику вашего приложения. Ниже приведена логика видеоплеера. Когда видео воспроизводится, оно открывается в полноэкранном режиме. Когда видео останавливается, оно выходит из полноэкранного режима. Когда видеоплеер находится в полноэкранном режиме, он может быть в состоянии Воспроизведение или Пауза.

Преимущества конечных автоматов

  • Простота понимания. Конечные автоматы визуальны и просты для понимания. Это отличный способ коммуникации с вашей командой и заинтересованными сторонами.
  • Простота тестирования. Конечные автоматы детерминированы, что означает, что их легко тестировать. Вы можете протестировать все возможные состояния и переходы между ними.
  • Простота реализации. Конечные автоматы легко реализовать на любом языке программирования. Вы можете использовать библиотеку или написать свою собственную.
  • Простота сопровождения. Конечные автоматы легко сопровождать, потому что их легко понять, протестировать и реализовать.
  • Они обеспечивают чёткий и лаконичный способ моделирования сложных пользовательских интерфейсов и управления состоянием приложения.
  • Конечные автоматы могут помочь снизить сложность и улучшить сопровождаемость, предоставляя структурированный способ управления переходами состояний и обработки событий.
  • Они также могут помочь предотвратить ошибки и улучшить качество кода, обеспечивая чёткое разделение ответственности между различными частями приложения.
  • Кроме того, конечные автоматы могут быть легко сопровождаемыми и предлагают способ сделать очень сложные фронтенд-процессы гораздо более управляемыми.

На бэкенде

Что такое диаграмма состояний?

Диаграммы состояний (statecharts) расширяют традиционные конечные автоматы для моделирования более сложной логики.

Диаграммы состояний — это визуальное расширение конечных автоматов, которое использует блоки и стрелки, подобно блок-схемам и диаграммам последовательностей. Диаграммы состояний добавляют дополнительные возможности, недоступные в обычных конечных автоматах, включая иерархию, параллелизм и коммуникацию.

Когда вы создаёте конечный автомат в Stately Studio, это также является диаграммой состояний!

Состояния

Состояние описывает статус или режим автомата, который может быть таким простым, как Спит и Бодрствует. Конечный автомат может находиться только в одном состоянии в каждый момент времени.

Конечный автомат собаки с состояниями "спит" и "бодрствует". На состоянии "бодрствует" есть предупреждение, потому что нет переходов, что означает, что состояние "бодрствует" недостижимо. Конечный автомат собаки с состояниями "спит" и "бодрствует". На состоянии "бодрствует" есть предупреждение, потому что нет переходов, что означает, что состояние "бодрствует" недостижимо.

Посмотреть автомат состояний собаки в Stately Studio.

Собака всегда либо спит, либо бодрствует. Собака не может спать и бодрствовать одновременно, и невозможно, чтобы собака не спала и не бодрствовала. Есть только эти два состояния — точно ограниченное, конечное число состояний.

Когда конечный автомат запускается, он сначала входит в начальное состояние. Автомат может иметь только одно начальное состояние верхнего уровня; если бы было несколько начальных состояний, автомат не знал бы, с чего начать!

В этой диаграмме состояний, описывающей процесс выгула собаки, начальным состоянием будет ожидание прогулки.

Состояния в XState

Состояния определяются в конечных автоматах XState внутри свойства states.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import { createMachine } from 'xstate';

const dogMachine = createMachine({
    id: 'dog',
    initial: 'asleep',
    // highlight-start
    states: {
        asleep: {
            // ...
        },
        awake: {
            // ...
        },
        //...
    },
    // highlight-end
});

Переходы и события

То, как собака переходит между состояниями спит и бодрствует, происходит через переходы. События вызывают переходы; когда происходит событие, автомат переходит в следующее состояние. Собака переходит между состояниями спит и бодрствует через события просыпается и засыпает.

Переходы «детерминированы»; каждая комбинация состояния и события всегда указывает на одно и то же следующее состояние. Собаки никогда не просыпаются, чтобы заснуть, или засыпают, чтобы проснуться.

автомат состояний собаки с событиями и переходами автомат состояний собаки с событиями и переходами

Посмотреть автомат состояний собаки с событиями и переходами в Stately Studio.

С двумя конечными состояниями и переходами этот маленький процесс собаки является конечным автоматом. Конечный автомат используется для описания поведения чего-либо. Автомат описывает состояния объекта и переходы между этими состояниями. Это конечный автомат, потому что у него конечное число состояний. (Иногда сокращается до FSM теми, кто любит жаргон).

Подробнее о переходах и событиях.

События и переходы в XState

События и переходы определяются в конечных автоматах XState внутри свойства on состояния.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { createMachine } from 'xstate';

const dogMachine = createMachine({
    id: 'dog',
    initial: 'asleep',
    states: {
        asleep: {
            // highlight-start
            on: {
                'wakes up': 'awake',
            },
            // highlight-end
        },
        awake: {
            // highlight-start
            on: {
                'falls asleep': 'asleep',
            },
            // highlight-end
        },
        //...
    },
});

Финальное состояние

Большинство процессов с состояниями имеют финальное состояние, последнее состояние, когда процесс завершён. Финальное состояние представлено двойной рамкой на прямоугольнике состояния со скруглёнными углами.

В диаграмме состояний выгула собаки финальным состоянием будет прогулка завершена.

Диаграмма состояний выгула собаки, показывающая состояние ожидания, переходящее через событие "выход из дома" в состояние "на прогулке", затем переходящее через событие "возвращение домой" в финальное состояние "прогулка завершена". Диаграмма состояний выгула собаки, показывающая состояние ожидания, переходящее через событие "выход из дома" в состояние "на прогулке", затем переходящее через событие "возвращение домой" в финальное состояние "прогулка завершена".

Посмотреть автомат выгула собаки в Stately Studio.

Подробнее о финальных состояниях

Родительские состояния

Родительское состояние — это состояние, которое может содержать другие состояния, также известные как дочерние состояния. Эти дочерние состояния могут существовать только тогда, когда родительское состояние активно. Внутри состояния на прогулке могут быть дочерние состояния идёт и бежит.

Родительское состояние обозначается подписанным прямоугольником, который служит контейнером для своих дочерних состояний. Родительские состояния иногда называют составными состояниями.

автомат выгула собаки автомат выгула собаки

Посмотреть автомат выгула собаки в Stately Studio.

Родительское состояние также должно указывать, какое дочернее состояние является начальным. В родительском состоянии на прогулке начальным состоянием является идёт.

Родительские и дочерние состояния — это одна из особенностей, которые делают диаграммы состояний способными обрабатывать более сложную логику, чем обычный конечный автомат.

Подробнее о родительских состояниях.

Атомарные состояния

Атомарное состояние — это состояние, которое не имеет дочерних состояний. Ожидание, прогулка завершена, идёт и бежит — все это атомарные состояния.

Параллельные состояния

Параллельное состояние — это состояние, в котором все его дочерние состояния, также известные как регионы, активны одновременно. Регионы разделены внутри контейнера параллельного состояния пунктирной линией.

Внутри параллельного состояния на прогулке могут быть два региона. Один регион содержит дочерние состояния активности собаки — идёт и бежит, а другой регион содержит состояния хвоста собаки — виляет и не виляет. Собака может идти и вилять хвостом или бежать и вилять хвостом, она также может выполнять оба этих действия без виляния хвостом.

автомат выгула собаки автомат выгула собаки

Посмотреть автомат выгула собаки в Stately Studio.

Оба региона также должны указывать, какое дочернее состояние является начальным. В нашем регионе хвост начальным состоянием является не виляет.

Подробнее о параллельных состояниях.

Переход на себя

Переход на себя (self-transition) — это когда происходит событие, но переход возвращает в то же самое состояние. Стрелка перехода выходит и снова входит в то же состояние.

Полезный способ описать переход на себя — «делать что-то, не уходя куда-то» в процессе.

В процессе собака просит еду будет состояние просит с событием получает лакомство. И для собак, которые любят свою еду, сколько бы раз вы ни прошли через событие получает лакомство, собака возвращается в состояние просит.

автомат "собака просит" автомат "собака просит"

Посмотреть автомат "собака просит" в Stately Studio.

Подробнее о переходах на себя

Что дальше?

Теперь вы знаете достаточно, чтобы начать работу в Stately Studio. Ознакомьтесь с обзором Stately Studio и его возможностями или продолжите изучение XState.

Комментарии