Захотелось
мне странного намедни. Хочу код
яваскриптовый попроще и попонятнее
сделать в одном из проектов. А для этого
его надо переписать в виде FSM.
Как всегда, первый вопрос — самому
делать велосипед или готовый взять?
Решил попробовать готовый
Уже начал все
переписывать и чую, не идет. Долго думал,
почему. Потом понял — банально неудобно.
Как выглядит
в библиотечке создание матрицы состояний:
var fsm = StateMachine.create({ initial: 'green', events: [ { name: 'warn', from: 'green', to: 'yellow' }, { name: 'panic', from: 'yellow', to: 'red' }, { name: 'calm', from: 'red', to: 'yellow' }, { name: 'clear', from: 'yellow', to: 'green' } ]}); |
Где тут actions?
Нету. Действия задаются как реализация
колбеков:
events: [ { name: 'warn', from: 'green', to: 'yellow' }, { name: 'panic', from: 'yellow', to: 'red' }, { name: 'calm', from: 'red', to: 'yellow' }, { name: 'clear', from: 'yellow', to: 'green' } ], callbacks: { onpanic: function(event, from, to, msg) { alert('panic! ' + msg); }, onclear: function(event, from, to, msg) { alert('thanks to ' + msg); }, ongreen: function(event, from, to) { document.body.className = 'green'; }, onyellow: function(event, from, to) { document.body.className = 'yellow'; }, onred: function(event, from, to) { document.body.className = 'red'; }, } // onbeforeevent - fired before the event // onleavestate - fired when leaving the old state // onenterstate - fired when entering the new state // onafterevent - fired after the event |
И нет способа
связать действие с парой Состояние_Событие.
Есть отдельно на состояние и отдельно
на событие, что размазывает код на
дополниетельные if-else. Неудобно и некрасиво
выходит.
А удобно было
бы так (с
форума python.su):
self.table = { ('START', 'EOL'): ('EXIT', None), ('START', 'GOODDIGIT'): ('GOOD', self.add_to_result), ('START', 'DELIM'): ('START', None), ('GOOD', 'GOODDIGIT'): ('GOOD', self.add_to_result), ('GOOD', 'BADDIGIT'): ('BAD', self.clean_result), … def parse(self, inp, state='START'): while state != 'EXIT': event = self.get_event(inp) state, action = self.table[(state, event)] if action: action() |
На входе текущее
состояние и событие, на выходе следующее
состояние и функция для запуска. Удобно.
Так что для
моей задачи готовый велосипед не подошел.
Придется делать свой.
Комментариев нет:
Отправить комментарий