2015-07-01 4 views
14

Update:Паттерн состояние и охрана

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

+0

У вас есть начальное состояние, я предполагаю? –

+0

Что вы рисуете это в ... UML/Flow ...? –

+0

@DavidBarker, нет. Мне просто нужно что-то визуальное, чтобы понять, как реализовать. – norbertpy

ответ

3

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

enter image description here

+0

Спасибо, но как бы избежать записи' if (A && B && C) '? Причина в том, что у меня уже есть много, если и еще с различными условиями. Единственная причина для выбора автомата - это не делать этого. – norbertpy

+0

А, я вижу. Что стоит за этим - это домашняя работа для школы или что вы хотите реализовать? –

+0

Это не домашнее задание. Я старше этого рода. Это настоящая проблема, и мы пытаемся упростить ситуацию. – norbertpy

4

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

Sample lexical state analysis

Использование пакета FSM я написал для Laravel, пример установки FSM would look something like this.

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

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

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

Когда вы смотрите на несколько состояний, каждое состояние формирует требование к ограничениям. A sample state would look something like this.

Когда вы смотрите на одно состояние с псевдо-состояниями/обработчиками. The state would look something like this, where it's logic is contained.

1

государственная машина абстракции состоит из:

  1. государств
  2. События или входы
  3. Transitions
  4. действия

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

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

Смежные вопросы