Государственный образец и охрана

Update:

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


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

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

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

Следующая диаграмма состояний взята из книги Мартина Фаулера по конкретным языкам.

DSL

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

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

Я подчеркиваю, что turning light и opening 2nd drawer могут выполняться в любом порядке. То же, что A, B и C.

На основе комментария @SQLPolice и книги я нарисовал это:

enter image description here

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

Ответы

Ответ 1

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

Sample lexical state analysis

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

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

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

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

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

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

Ответ 2

Быстрый черновик выглядит следующим образом:

enter image description here

Ответ 3

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

  • States
  • События или входы
  • Transitions
  • Действия

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

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