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-ое состояние.
Следующая диаграмма состояний взята из книги Мартина Фаулера по конкретным языкам.
В описании он говорит:
Мисс Грант, имеет секретное отделение в своей спальне который обычно заблокирован и скрыт. Чтобы открыть его, она должна закрыть дверь, затем откройте второй ящик в груди и поверните ее прикроватный светильник на в любом порядке. Как только это будет сделано, секрет панель открыта для ее открытия.
Я подчеркиваю, что turning light
и opening 2nd drawer
могут выполняться в любом порядке. То же, что A, B и C.
На основе комментария @SQLPolice и книги я нарисовал это:
Но проблема в том, что я мог бы (A && B & C & D && D && E). В этом случае это будет громоздко, чтобы иметь все промежуточные состояния комбинации.