Что такое машина конечного состояния и для чего она используется?

В последнее время я начал делать некоторые исследования в 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

Он часто используется в сканере и лексере парсера языка. Создание и анализ каждого токена в исходном коде на основе определенных правил синтаксиса.

В принципе, здесь вы проверяете текущее состояние, чтобы узнать, понятны ли следующие символы или токены и как они должны быть организованы.