Skip to content

Weenty/state_mahine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 

Repository files navigation

Конечный автомат — это некоторая абстрактная модель, содержащая конечное число состояний чего-либо. Используется для представления и управления потоком выполнения каких-либо команд. Если более простыми словами, это модель вычислений, основанная на гипотетической машине состояний. В один момент времени только одно состояние может быть активным. Следовательно, для выполнения каких-либо действий машина должна менять свое состояние. Конечный автомат идеально подходит для реализации искусственного интеллекта в играх, получая аккуратное решение без написания громоздкого и сложного кода

Пример

Конечные автоматы обычно используются для организации и представления потока выполнения чего-либо. Это особенно полезно при реализации ИИ в играх. Например, для написания «мозга» врага: каждое состояние представляет собой какое-то действие (напасть, уклониться и т. д.). image

Пример

Как поможет конечный автомат в реальных проектах? Возьмём пример из реального проекта: Есть сценарий регистрации новых пользователей в системе. В процессе регистрации пользователь проходит через несколько этапов:

  1. заполнение анкеты;
  2. подтверждение электронной почты;
  3. привязка мобильного устройства через QR-код;
  4. окончание регистрации.

image

Представим, что мы занимаемся реализацией метода, устанавливающего состояние объекта Пользователь. Данный метод должен каждый раз проверять текущее состояние и корректность перехода в новое состояние согласно всем бизнес-правилам. Нельзя, например, привязать мобильный телефон, пока электронная почта не подтверждена. Или же нельзя дважды подтверждать один и тот же адрес электронной почты. Для реализации этого метода можно воспользоваться оператором switch:

image

Можно заметить, что такое решение имеет ряд недостатков:

  1. Если бизнес-правила изменятся, то в метод каждый раз придется вносить изменения.
  2. Этот код плохо читается, его неудобно сопровождать.
  3. Со временем подобные условия расползаются по коду, что приводит к ошибкам. Для решения данных проблем воспользуемся концепцией конечных автоматов. Мы рассмотрим реализацию на примере PHP, фреймворка Symfony и бандла StateMachineBundle. Существует целый ряд бандлов с реализацией конечных автоматов для Symfony, которые мы рассмотрим чуть позже. Допустим, на примере интернет-магазина. Одним из ключевых сценариев для интернет-магазина является процесс оформления заказа пользователем. Прежде чем заказ будет обработан, пользователь должен указать свои контактные данные, выбрать способ доставки и оплаты, при этом каждый этап может влиять на конечную стоимость заказа. Этот процесс можно представить в виде многоступенчатой формы. Важный момент: на любом этапе оформления можно вернуться к предыдущему шагу, что в свою очередь повлечет за собой изменение окончательной суммы заказа.

image

image

Наш конечный автомат имеет 5 возможных состояний (states) и 4 возможных перехода (transitions). Каждый переход регламентируется списком возможных исходных состояний (from) и целевым состоянием (to). Преимущества данного подхода очевидны:

  1. Простота и наглядность схемы, код понятен и не требует дополнительных комментариев.
  2. Возможность легко и быстро вносить изменения.
  3. Подходит для решения очень сложных задач.

Вывод:

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published