Государственный образец и охрана
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 меняются, или периодически проверять их по таймеру. Каждый раз, когда они меняются, ваш код переходит к событию и помещает его в любой код, продвигающий конечный автомат.