JUNIOR-BLOG

Для всех кто увлекается программированием

Второй доклад Podlodka PHP Crew 5 Как стать x2 разработчиком, используя явное состояние

Как стать x2 разработчиком, используя явное состояние - Кирилл Мокевнин.

Кирилл в этом докладе рассказывает про конечные автоматы.

 

Явно выделенное состояние

Пример: на платформе можно оформить платную подписку и раз в месяц сторонний сервис, отправляет на указанный email подтверждение об оплате квитанцию и т.д. Но проблема в том, что такие сервисы принимаю email один раз при оформлении подписки. Если пользователь поменяет почту на платформе, то в сервисе данные остануться не синхронизированными.

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

Для этого мы можем использовать дату, и перед синхронизацией устанавливать ее в null, таким образом если у нас что-то упадеть, мы поймем что было не синхронизированно аля софт делит. Так дата невсегда понятно и тогда мы можем добавить два состояния синхронизированно/несинхронизированно.

Но редко когда нам понадобиться два состояния.  В таком случае тогда нам нужен не флаг, а полноценное состояние pending, failed, synchrononized  - вот эта штука называетя явно выделенное состояние.

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

К сожалению, я не запомнил или не услышал четкого определения, что такое конечные автоматы, поэтому обратилсяк ЖПТ чату, и просто отправлю его определение:

Конечные автоматы (или конечные автоматы с дискретным состоянием) — это математические модели, которые используются для описания поведения систем с конечным числом состояний. Они часто применяются в различных областях, включая теорию формальных языков, проектирование компиляторов, обработку текстов и многое другое.

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

Основные компоненты конечного автомата:

  1. Состояния: Конечный автомат может находиться в одном из нескольких состояний.

  2. Начальное состояние: Состояние, в котором автомат начинает свою работу.

  3. Состояния переходов: Правила, определяющие, как автомат переходит из одного состояния в другое на основе входных данных.

  4. Входные символы: Данные, которые приводят к переходам между состояниями.

  5. Конечные состояния: Состояния, в которых автомат может завершить свою работу.

Пример реализации конечного автомата на PHP

Вот простой пример конечного автомата, который обрабатывает строки "yes" и "no":

class FiniteStateMachine {
    private $state;
    private $transitions;

    public function __construct() {
        // Начальное состояние
        $this->state = 'start';

        // Определение переходов
        $this->transitions = [
            'start' => [
                'yes' => 'yes_state',
                'no' => 'no_state',
            ],
            'yes_state' => [
                'yes' => 'yes_state',
                'no' => 'no_state',
            ],
            'no_state' => [
                'yes' => 'yes_state',
                'no' => 'no_state',
            ],
        ];
    }

    public function input($symbol) {
        if (isset($this->transitions[$this->state][$symbol])) {
            $this->state = $this->transitions[$this->state][$symbol];
        } else {
            throw new Exception("Invalid input: $symbol");
        }
    }

    public function getState() {
        return $this->state;
    }
}

// Пример использования
$fsm = new FiniteStateMachine();

try {
    $fsm->input('yes');
    echo $fsm->getState(); // yes_state

    $fsm->input('no');
    echo $fsm->getState(); // no_state

    $fsm->input('yes');
    echo $fsm->getState(); // yes_state
} catch (Exception $e) {
    echo $e->getMessage();
}
 

Заключение

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

 

Дополнительный материал в догонку:  тык 

Похожие статьи

Первый доклад Podlodka PHP Crew 5 Упорядочиваем хаос архитектурная документация по модели C4

Только что закончился первый доклад в рамках Podlodka PHP Crew #5 на тему «Упорядочиваем хаос: архитектурная документация по модели C4» / Кирилл Сурогатов (Oxagile, Head of JS)!

Читать дальше...

Комментарии