menu
Меню
Drakon.Tech logo
Drakon.Tech
Начать работу
Документация по Drakon.TechПрограммирование на языке ДРАКОНОсновы программирования в Drakon.TechПродвинутые темы программированияasync/awaitАвтоматное программированиеМодули и зависимостиСовместная работаРабота с системами контроля версийПримеры игрThe source codeLegacy tutorials (JavaScript 0.2)

Автоматное программирование

Ru | En

Исходный код:
Simple input
Receive
Pause

async-функции в Drakon.Tech представляют собой конечные автоматы. Конечные автоматы — мощное средство моделирования поведения компьютерных систем. При помощи конечных автоматов можно задавать сложные реакции программы на внешние воздействия.

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

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

Как создать конечный автомат в Drakon.Tech

Чтобы создать конечный автомат, достаточно создать async-функцию. async-функции в Drakon.Tech реализованы при помощи конечных автоматов.

Как создать и запустить экземпляр конечного автомата.

  1. Вызовите async-функцию без ключевого слова await и к имени функции добавьте _create. Например, если async-функция называется Foo, то надо вызвать функцию Foo_create(). Параметры передаются в такую функцию в обычном режиме. _create-функция возвращает ссылку на новый конечный автомат.
  2. Запустите автомат при помощи метода run().
machine = Foo_create();
machine.run();

Как остановить конечный автомат

Конечный автомат в Drakon.Tech прекращает работу сам по себе, когда поток исполнения достигает иконы Конец.

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

Чтобы остановить конечный автомат, надо установить поле state в значение undefined.

machine.state = undefined;

Как передать сообщение конечному автомату

Есть две иконы, при помощи которых автомат переходит в режим ожидания сообщений: икона Простой ввод и икона Выбор с ключевым словом receive. На основании этих икон генератор кода добавит в автомат методы, которые можно будет вызвать снаружи. При вызове такого метода автомат получит сообщение и продолжит работу. Очень важно, что эти методы-события следует вызывать тогда, когда автомат ожидает их. Иначе вызовы будут проигнорированы.

Икона Простой ввод

В иконе Простой ввод указывают название метода, а также аргументы. Для данного автомата будет сгенерирован метод с указанным именем и набором аргументов. При достижении потоком выполнения иконы Простой ввод автомат войдёт в состояние ожидания вызова указанного метода. После вызова автомат продолжит своё выполнение, а аргументы метода станут доступны как локальные переменные.

Получение сообщения при помощи иконы Простой ввод

В данном примере икона Простой ввод даст генератору кода указание создать метод hello(name). Автомат в иконе Простой ввод приостановится и будет ждать вызова метода hello(name).

Как передать сообщение конечному автомату

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

Несколько икон Простой ввод

Икона Выбор с ключевым словом receive

Икона Простой ввод задаёт ожидание одного типа события. Если нужно, чтобы автомат ожидал несколько типов событий, следует применять икону Выбор с ключевым словом receive.

В иконах Вариант под иконой Выбор-receive задаются имена методов-событий и их аргументы. Икона Вариант-receive, как и икона Простой ввод, — точка временной остановки автомата, или одно из состояний автомата (так же, как и икона Простой ввод). В этой точке автомат принимает сообщения, определённые иконами Вариант.

Выбор-receive

В данном примере есть две иконы Вариант-receive, а значит — два состояния конечного автомата. В обоих состояниях автомат принимает два типа сообщений: left() и right(). Текст, выводимый при поступлении этих сообщений, зависит только от самого сообщения, left() или right(). А вот цвет текста зависит от состояния, в котором находится автомат.

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

Отправка сообщений из async-функций при помощи иконы Простой вывод

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

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

Икона Простой вывод откладывает обработку сообщения до следующего прогона цикла обработки событий браузера.

Отправка сообщений из async-функций при помощи иконы Простой вывод

Если один автомат вызывает метод другого автомата, используйте икону Простой вывод.

Икона Пауза

При помощи иконы Пауза можно приостановить выполнение async-функции.

Икона Пауза

В иконе Пауза следует указывать время задержки в миллисекундах.

Исходный код:
Simple input
Receive
Pause
close
Закрыть
Drakon.Tech logo
Drakon.Tech - начало
Программирование на языке ДРАКОНОсновы программирования в Drakon.TechПродвинутые темы программированияThe source codeLegacy tutorials (JavaScript 0.2)