Захотелось
мне странного намедни. Хочу код
яваскриптовый попроще и попонятнее
сделать в одном из проектов. А для этого
его надо переписать в виде 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()
|
На входе текущее
состояние и событие, на выходе следующее
состояние и функция для запуска. Удобно.
Так что для
моей задачи готовый велосипед не подошел.
Придется делать свой.
Комментариев нет:
Отправить комментарий