Государственный рисунок и охрана

Обновить:

Государственная модель может быть неправильным способом решить эту проблему. Следовательно, любая другая модель приветствуется. По сути, я ищу способ иметь охранные условия для каждого штата, но иметь чистый и поддерживаемый код. Как бы реализовали внешние системы маршрутизации, такие как, emberjs, ui-router и реакции-router? guard conditions не входить в определенное состояние, если условие не выполняется?


Я хочу реализовать конечный автомат с помощью State Pattern, но я не могу обернуть его вокруг. Короче это как:

If error -> error state
If A && B && C -> second state
If only A -> first state

В любом состоянии, по ошибке, мы переходим в состояние ошибки. входы (события) A, B и C могут поступать в любом порядке, но если они все проходят, мы переходим во 2-е состояние. Если применяется только вход A, то мы переходим в 1-е состояние.

Следующая диаграмма состояний взята из книги Мартина Фаулера "Язык, специфичный для предметной области".

DSL

В описании он говорит:

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

Подчеркиваю, что turning light а также opening 2nd drawer может произойти в любом порядке. То же, что A, B и C.

Основываясь на комментарии @SQLPolice и книге, я нарисовал это:

Но проблема в том, что у меня может быть (A && B && C && D && D && E). В этом случае будет сложно иметь все промежуточные состояния комбинации.

3 ответа

Вы можете использовать некоторую форму лексического анализа для этого. Я бы подошел к этому, ограничив возможность перехода из состояния, если не соблюдаются ограничения, установленные на границе между двумя состояниями. Недавно я написал FSM на PHP для фреймворка Laravel, в котором есть такой пример, где все ограничения должны быть истинными, прежде чем может произойти переход. Он использует псевдосостояния или дескрипторы внутри состояния для переключения флага, указывающего, что процесс завершен. Только когда все флаги установлены в значение true, переход к состоянию возможен.

Образец анализа лексического состояния

Используя пакет FSM, который я написал для laravel, пример установки FSM будет выглядеть примерно так.

Каждое состояние (либо onEnter), либо через псевдо-состояние устанавливает свой флаг ограничения на FSM OR State в значение true.

Это также вызвало бы checkReady() это вызовет переход или сохранит текущее состояние на основе флагов ограничения.

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

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

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

Быстрый черновик выглядит так:

Абстракция конечного автомата состоит из:

  1. состояния
  2. События или входы
  3. Переходы
  4. действия

Оператор, такой как &&b&&c, фактически является событием или входом... меткой для перехода. Так что это должно быть сопоставлено с событием, если вы собираетесь вписаться в абстракцию конечного автомата. Вам нужно написать код, чтобы сделать это отображение.

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

Другие вопросы по тегам