2013-02-11 10 views
12

Недавно я начал делать некоторые исследования в конечных машинах в JavaScript, и я даже found a library, что упрощает их реализацию. Хотя я думаю, что понял, что конечный автомат используется для отслеживания и изменения «состояния» объекта (например, «готовый», «полный», «неактивный» и т. Д.), Я не думаю, я полностью понимаю их практическое значение. Может кто-то пожалуйста, помогите, разъясняя следующее:Что такое машина конечного состояния и для чего она используется?

  • Что именно является конечным автоматом [или это просто называется состояние машины? Я слышал, что это упоминалось в обоих направлениях]?
  • Что такое практическое использование для конечных автоматов (в JavaScript)?
  • Когда бы я не хочу использовать конечный автомат?
  • Какие книги, статьи, учебные пособия и т. Д. Предлагают более глубокий взгляд на конечные машины (в JavaScript)?
+0

Wikipedia? Google? Кстати, обратите внимание, что JavaScript - это просто ** язык сценариев ** (т. Е. Он определяет только основной API). Таким образом, практическое использование зависит от ** среды ** (веб-браузер, веб-сервер, Win8), а не от самого языка. –

+2

Я действительно на самом деле это Google. Вот почему я упомянул, что понял, что конечный автомат используется для отслеживания состояния в приложении, но мне трудно понять практические последствия этого, и я надеюсь, что кто-то сможет прояснить ситуацию. –

+0

Возможно многоэтапные формы? –

ответ

9

Конечный государственный аппарат представляет собой абстрактное понятие. Таким образом, концепция конечного автомата ортогональна какому-либо определенному языку. Если вы look at wikipedia, он говорит: «Это математическая модель расчета, используемая для проектирования как компьютерных программ, так и последовательных логических схем».

Это означает, что FSM обычно используется в качестве математической концепции, которая используется учеными-компьютерщиками для решения вопросов с дисциплиной, например «может ли xyz быть вычислена вообще»?

Основываясь на вашем вопросе и вашей ссылке, я думаю, вы хотите спросить о Диаграмме состояния (или Statechart), которая отличается. Когда вы создаете диаграмму состояний, вы делите свою программу в ряд состояний и события, которые могут возникать в этих состояниях. Например, ваша программа может находиться в состоянии «Редактирование», получать событие «doSave», а затем переходить в состояние «Сохранение», получать событие «Сохранить завершенное» и вернуться в состояние «Просмотр».

Эта абстракция невероятно полезна, потому что она позволяет программисту концептуально организовывать то, что должно происходить, когда, когда оно выполняется правильно, ведет к более чистому и более организованному коду, что в свою очередь приводит к меньшему количеству ошибок. Диаграмма состояния, в зависимости от реализация может предотвратить непреднамеренные эффекты, только обрабатывая события, определенные для состояния. Например, «Просмотр», вероятно, не имеет определенного события «сохранения», поэтому, если программа находится в состоянии «Просмотр», любое сохранение не имеет смысла , поскольку это должно произойти только в состоянии «Редактирование».

Если вы посмотрите на обзор рамки, на которую вы ссылаетесь, вы заметите, что есть куча обработчиков, которые вы можете использовать для захвата вхождения в состояния, состояния, действия, происходящие и т. Д. Это позволяет вам делать то, что соответствует к состоянию/действию. Например, при входе в состояние «Редактирование» вы можете представить форму пользователю и включить кнопку «Сохранить». При входе в состояние «Сохранение» вы можете отключить кнопку и запустить запрос на сохранение. При получении события «SaveComplete» вы можете перейти в состояние «Просмотр», удалить форму и показать что-то еще.

+0

Таким образом, государственный автомат управляет «состоянием», отслеживая, что приложение («просматривает» страницу), а затем либо действует, либо игнорирует события, которые запускаются (в условиях JavaScript)? Это почти похоже на контроллер (MVC) или шину событий. –

+1

Очень похоже. В тех реализациях, которые я использовал, вы перемещаетесь через свое приложение, вызывая события в файле состояния, поэтому он действительно не отслеживает - это точка входа для управления программой. – hvgotcodes

+0

Поскольку я изучал и использовал однонаправленный поток данных в клиентских приложениях с Flux и особенно Redux, я начал понимать, что Redux действительно помогает вам использовать детерминированный конечный конечный автомат для обработки вашего пользовательского интерфейса. В Redux поднятые события представлены как действия, а функции редуктора, которые являются чистыми функциями, подобны функциям перехода, которые принимают текущее состояние и входы от поднятых событий/действий и создают новое состояние, таким образом, переход вашего пользовательского интерфейса на следующий государство. – lastmjs

2

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

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

+0

Ах да, отличный пример. –

10

Что такое конечный автомат?

Это способ объявления событий и побочных эффектов перехода между ними.

Что такое практическое использование конечных автоматов?

Вместо кода, как это:

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 в the jquery ui source

Смежные вопросы