Comments 7
На самом деле, State — это лишь один из способов реализовать конечный автомат в ООП, и он прекрасен в своей простоте. Но что делать, когда логика усложняется, появляются асинхронные переходы, а количество состояний и событий растет? В этот момент простой паттерн State уступает место полноценным State Machine (FSM). А когда и их возможностей становится недостаточно для описания по-настоящему сложных систем с иерархией и параллельными процессами, на сцену выходят Statecharts.
Эта статья - нейросетевой мусор
Так и не понял: FSM, Statecharts реализую автомат Мура или Милли?
И второе. Конечный автомат имеет "поток входных событий" (может быть асинхронен), "слушатель потока" тот код, который принимает входной поток событий (например обработчик прерывания) и он в общем случае, может быть отделен от кода КА, например даже аппаратно (привет ООП). Далее есть "текущее состояние" и таблица переходов (для табличного КА) и обработчики состояний, которые также могут изменять состояние КА (тот самый switch для простых решений). Обработчик состояния может как повторять действия текущего состояния (непрерывность, например подачи напряжения на мотор) так и исполнять его разово (исполнитель в переходе из состояние1 в состояние2). Не этим ли, как раз отличаются Милли от Мура? )
Далее, опущено рассмотрение конечных автоматов с памятью, позволяющих не только откат на какое-то предыдущее состояние как в статье, но и отложенные действия для запомненных состояний (разбор контекстно-зависимых грамматик к примеру).
Statecharts - кмк, всего лишь "вложение" нескольких КА один в другой, возможно с единым "слушателем входного потока".
И да, без наличия входного потока событий, как такого конечного автомата не бывает, ибо "нет смысла". Но .. применить можно, как и микроскопом забивать гвозди. )
Собственно тут излагал когда-то теорию КА для детишек под Ардуино с примерами: https://community.alexgyver.ru/threads/programmirovanie-konechnyx-avtomatov-bez-delay.2657/
Спасибо за комментарий!
Так и не понял: FSM, Statecharts реализую автомат Мура или Милли?
Хороший вопрос! Не силен в теории автоматов, могу предположить что Мили, так как результирующий переход зависит от входящих данных и состояния. Но, могу быть не прав.
Далее, опущено рассмотрение конечных автоматов с памятью, позволяющих не только откат на какое-то предыдущее состояние как в статье, но и отложенные действия для запомненных состояний (разбор контекстно-зависимых грамматик к примеру).
Хорошее замечание. Настолько глубоко не использовал FSM, нужно разобраться в вопросе.
Statecharts - кмк, всего лишь "вложение" нескольких КА один в другой, возможно с единым "слушателем входного потока".
Да, это просто расширение.
Не силен в теории автоматов, могу предположить что Мили, так как результирующий переход зависит от входящих данных и состояния. Но, могу быть не прав.
Индустрия давно отказалась от деления конечных автоматов на Мили и Мура - этим теперь только студентов мучают. Делайте каждый переход таким как удобно именно в этом месте и будет норм
А вот это совершенно зря. Автомат Мура работает ПОКА есть состояние, т.е. его выдача стабильна в одном и том же состоянии. Автомат Милли работает на переходах МЕЖДУ состояниями, то есть это "импульсное" или "разовое" поведение.
Но тут, как-бы пропущено основное определение "Программа" - это код, который ПРИНИМАЕТ на вход данные и отдает что-то на ВЫХОД. Пропущено выше главное - входной поток данных. Не бывает программ, не принимающих на вход ничего, кроме "задающих генераторов", но этим важно нести свой понос во Вселенную и только. )
Для понимания автоматов, важно понятие "Входной поток данных" и соответственно, выделение этой части автомата в "слушателя потока" как его отдельную запчасть. И вот тут, уже понятие конечного автомата становится существенно шире:
Входной поток - время: разного рода таймеры, самый известный - стиральная машинка, работающая по временной программе своих состояний.
Входной поток - набор символов программы - имеем "парсер" компилятора или какой иной парсер.
Входной поток - события от клиента (нажал кнопку) - имеем разные "редакторы" того или иного типа.
Разделение на Слушателя и Исполнителя также дает лучшее понимание места смены состояния и различий между Мура и Милли: в последнем, смена состояния происходит ВНУТРИ Исполнителя, т.к. "на переходе": можно вначале сменить состояние и выполнить код и ждать нового, а чаще это делают в конце - исполнил код, перешел в следующее состояние в конце.
Но! Можно изменять состояние в слушателе потока: прилетел символ, нажата кнопка, закончилось время .. поменяли состояние и Исполнитель .. а вот тут уже зависит кто он: Мура или Милли: первый начнет повторять(!!!) действия или бездействие нового состояния, а второй РАЗОВО(!!!) исполнит то, что требовалось по карте состояний.
Примеры из жизни:
автомат Мура - банальный выключатель света: поменяли ему состояние и лампочка включена, мотор крутится, и т.д. до тех пор, пока не поменяем состояние выключателя.
Автомат Милли - в этом плане: переключили выключатель, свет моргнул и погас. Разовое выполнение. Утрировано. )
Когда State уже не спасает: путь к Statechart