Рубрики
Без рубрики

Простые Государственные Машины На Java

Что такое Государственная машина? Википедия определяет конечный автомат (FSM) как: абстрактный… Помеченный java, чистый код, программное обеспечение, конечный автомат.

Что такое Государственная машина?

Википедия определяет конечный автомат (FSM) как:

абстрактная машина, которая может находиться ровно в одном из конечного числа состояний в любой момент времени. FSM может переходить из одного состояния в другое в ответ на некоторые внешние входы; переход из одного состояния в другое называется переходом. FSM определяется списком его состояний, его начальным состоянием и условиями для каждого перехода.

Это способ запрограммировать модель так, чтобы она находилась в одном определенном состоянии в любой момент.

Мир наполнен государственными машинами, которые мы можем видеть в любом месте нашего повседневного использования. Ниже приведены несколько

  • Сигналы дорожного движения Красный -> Желтый -> Зеленый
  • Автомат по продаже Кофе
  • Заказ на портале электронной коммерции
  • Онлайн-Бронирование Поездок
  • Много Заданий Cron

Реализация Государственных Машин На Java

Есть много способов, которыми мы можем реализовать государственные машины. В самом мире Java у нас есть множество библиотек, с помощью которых мы можем моделировать эти состояния

Мы также можем реализовать их с помощью стандартного Шаблона проектирования состояния [пример] https://www.journaldev.com/1751/state-design-pattern-java )

Что делать, если мы не хотим добавлять никаких внешних зависимостей? Что, если мы хотим иметь простую государственную машину и управлять ею с помощью нашей собственной логики?

Государственные машины, использующие перечисления в Java

Многие из нас воспользовались бы Uber или Ola хотя бы один раз. Давайте попробуем реализовать государственную машину бронирования поездок с помощью перечислений Java

Каковы идеальные состояния при бронировании поездки?

  • Забронированная Поездка
  • Назначенный водитель
  • Водитель Достиг
  • Поездка Началась
  • Поездка Закончилась

Простая Реализация

public enum TripStates {
    TRIPCREATED,
    DRIVERASSSIGNED,
    DRIVERREACHED,
    TRIPSTARTED,
    TRIPENDED;

}

Приведенное выше перечисление может быть использовано в нашем приложении для поддержания состояния поездки. Даже в базе данных это можно использовать, используя строковое значение перечисления. Пример Заявляет Трипп.ТРИПП CREATED.name ()

Теперь мы внедрили государственную машину, но как обеспечить надлежащий переход в состояние? Один простой способ – включить функцию в перечисление и проверять ее всякий раз, когда мы пытаемся изменить состояние поездки

public boolean canChangeTripState(TripStates fromState, TripStates toState){
        return fromState.ordinal()

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

Как мы можем достичь этого с помощью простого перечисления?

Перечисления Java могут содержать дополнительные поля. Мы можем использовать это для решения этой проблемы.

public enum TripStates {
    TRIPCREATED(Arrays.asList(new TripStates[]{})),
    DRIVERASSSIGNED(Arrays.asList(new TripStates[]{TripStates.TRIPCREATED})),
    DRIVERREACHED(Arrays.asList(new TripStates[]{TripStates.DRIVERASSSIGNED})),
    TRIPSTARTED(Arrays.asList(new TripStates[]{TripStates.DRIVERREACHED})),
    TRIPENDED(Arrays.asList(new TripStates[]{TripStates.TRIPSTARTED}));


    private List validFromStates = new LinkedList();


    TripStates(List validFromStates) {
        this.validFromStates = validFromStates;
    }

    public boolean canChangeTripState(TripStates fromState, TripStates toState) {
        return toState.validFromStates.contains(fromState);
    }
}

Если вы посмотрите, мы сохраняем действительный из штатов , чтобы легко распространить это на другие случаи, когда поездка может закончиться даже из разных штатов. Пример: Клиент Недоступен и т.д..

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

Оригинал: “https://dev.to/balaaagi/simple-state-machines-in-java-3mdo”