Rifat писал(а):
Мне кажется, что конечные автоматы - это слишком низкий уровень для человека. На низком уровне в аппаратуре переходы между состояними так и работают. Но для человека нужно что-нибудь более высокоуровневое.
И да, и нет.
Бывают автоматы низкого уровня, бывают автоматы высокого уровня.
Пример автомата низкого уровняЕсть веб-приложение, которое хранит документы. Сценарий "переименовать документ".
JavaScript в браузере должен выполнить несколько действий:
- получить настройки пользвователя с сервера
- получить документ с сервера
- запросить у пользователя новое название
- переформатировать документ
- сохранить документ на сервере
Как это реализовать?
Путь первый — не заморачивать себе голову и просовывать везде callbackи. Это ведёт к известной проблеме (pyramid of doom), когда в коде вообще не разберёшься.
К счатью, есть автоматы. Я сделал автомат, который имеет по одному состоянию на каждый из вышеописанных шагов. Автомат работает, загрузка идёт.
Вся логика в одном месте (автоматный силуэт). Это лучше, чем pyramid of doom (callback hell). Но проблема в том, что данный автомат действительно имеет низкий уровень.
Мне не удобно думать в понятиях автомата для данной задачи. А что удобно? Удобно явно задать шаги. В данном случае, автомат должен быть автоматически сгенерирован.
Но бывают автоматы высокого уровняЧто значит "высокого уровня"? Это значит, что человеку удобно думать по-автоматному для решения данной проблемы.
Пример — тот самый лифт из
статьи В.И. Шелехова.Там очень складно. Есть автомат "лифт", есть автомат "дверь". Всё логично.
Стоит отойти от автоматной логики, и тут же начинаются проблемы:
1. Можно забыть о каком-нибудь сообщении в каком-нибудь сочетании состояний.
2. Запутываешься в паутине if-then-else.
Вывод:1. Иногда автоматы можно и нужно рисовать в явном виде.
2. А иногда нужно рисовать что-то ещё (обычный ДРАКОН, например). И тогда автоматы должны быть автоматически построены.