Что такое машина конечного состояния и для чего она используется?
В последнее время я начал делать некоторые исследования в Finite State Machines в JavaScript и даже нашел библиотеку, которая упрощает их реализацию. Хотя я думаю, что понял, что конечный автомат используется для отслеживания и изменения "состояния" объекта (например, "готовый", "полный", "неактивный" и т.д.), Я не думаю, я полностью понимаю их практическое значение. Может кто-то помочь, пояснив следующее:
- Что такое конечный автомат [или он просто называется конечным автоматом? Я слышал, что это упоминалось в обоих направлениях]?
- Каковы некоторые практические применения для конечных автоматов (в JavaScript)?
- Когда я не хочу использовать конечный автомат?
- Какие книги, статьи, учебные пособия и т.д. предлагают более глубокий взгляд на конечные машины (в JavaScript)?
Ответы
Ответ 1
Конечная машина состояний - это абстрактное понятие. Таким образом, концепция конечного автомата ортогональна какому-либо определенному языку. Если вы посмотрите на wikipedia, в нем говорится: "Это математическая модель вычислений, используемая для разработки как компьютерных программ, так и последовательных логических схем".
Это означает, что FSM обычно используется в качестве математической концепции, используемой учеными-компьютерщиками для решения вопросов с дисциплиной, например, "может ли xyz быть вычислен вообще"?
Основываясь на вашем вопросе и вашей ссылке, я думаю, вы хотите спросить о диаграмме состояния (или Statechart), которая отличается. Когда вы создаете диаграмму состояний, вы делите свою программу в ряд состояний и события, которые могут возникать в этих состояниях. Например, ваша программа может находиться в состоянии "Редактирование", получать событие "doSave", а затем перейти в состояние "Сохранение", получить событие "Сохранить завершенное" и вернуться в состояние "Просмотр" .
Эта абстракция невероятно полезна, потому что она позволяет программисту концептуально организовывать то, что должно происходить, когда, когда оно выполняется правильно, приводит к более чистому и более организованному коду. Это, в свою очередь, приводит к меньшему количеству ошибок. Диаграмма состояния, в зависимости от реализации, может предотвратить непреднамеренные эффекты, только обрабатывая события, определенные для состояния. Например, "Просмотр" , вероятно, не имеет определенного события "сохранения", поэтому, если программа находится в "Просмотр состояния" Сохранить" не имеет смысла, поскольку это должно произойти только в состоянии "Редактирование".
Если вы посмотрите на обзор структуры, на которую вы ссылаетесь, вы заметите, что есть куча обработчиков, которые вы можете использовать, чтобы входить в состояния ввода, оставляя состояния, действия и т.д. Это позволяет вам действительно делать что-то которые соответствуют состоянию/действию. Например, при входе в состояние "Редактирование" вы можете представить форму пользователю и включить кнопку "Сохранить". При входе в состояние "Сохранение" вы можете отключить кнопку и запустить запрос на сохранение. При получении события "SaveComplete" вы можете перейти в состояние "Просмотр" , удалить форму и показать что-то еще.
Ответ 2
Что такое конечная машина?
Это способ объявления событий и побочных эффектов перехода между ними.
Что такое практическое использование конечных автоматов?
Вместо этого кода:
function decide()
{
if(mouseButtonIsDown && mouseIsMoving && mouseCoordinatesAreWithin(0, 0, 100, 100) && thePixelIsRed) {
clearBuffers();
startPlaying();
cursorBecomeHand();
}
else if(!mouseButtonIsDown && !mouseIsMoving && mouseCoordinatesAreWithin(0, 0, 100, 100) && thePixelIsRed) {
}
// more ifs
}
Вы сохраняете только несколько состояний и разбиваете свои события на функции, определяя, что происходит в каком состоянии.
function drag_started() {
switch(your_state) {
case "within_box":
clearBuffers();
cursorBecomeHand();
your_state= "playing";
startPlaying();
break;
}
}
Это приводит к разделению состояний и событий, что означает меньшие регрессии и большую ремонтопригодность.
Когда я не хочу использовать конечный автомат?
Отвечает на этот вопрос. Если у вас только одно состояние, не беспокойтесь о состоянии машины.
Какие книги, статьи, учебные пособия и т.д. предлагают более глубокий взгляд на конечные машины (в JavaScript)?
Против академии я рекомендую прочитать источник для jquery-плагинов. Например, посмотрите в _mouseMove и _mouseUp в источнике jquery ui
Ответ 3
Он часто используется в сканере и лексере парсера языка. Создание и анализ каждого токена в исходном коде на основе определенных правил синтаксиса.
В принципе, здесь вы проверяете текущее состояние, чтобы узнать, понятны ли следующие символы или токены и как они должны быть организованы.