Второй доклад Podlodka PHP Crew 5 Как стать x2 разработчиком, используя явное состояние
Как стать x2 разработчиком, используя явное состояние - Кирилл Мокевнин.
Кирилл в этом докладе рассказывает про конечные автоматы.
Явно выделенное состояние
Пример: на платформе можно оформить платную подписку и раз в месяц сторонний сервис, отправляет на указанный email подтверждение об оплате квитанцию и т.д. Но проблема в том, что такие сервисы принимаю email один раз при оформлении подписки. Если пользователь поменяет почту на платформе, то в сервисе данные остануться не синхронизированными.
Соответсвенно мы можем написать код, который будет синхронизировать данные, но как понять что синхронизированно или нет.
Для этого мы можем использовать дату, и перед синхронизацией устанавливать ее в null, таким образом если у нас что-то упадеть, мы поймем что было не синхронизированно аля софт делит. Так дата невсегда понятно и тогда мы можем добавить два состояния синхронизированно/несинхронизированно.
Но редко когда нам понадобиться два состояния. В таком случае тогда нам нужен не флаг, а полноценное состояние pending, failed, synchrononized - вот эта штука называетя явно выделенное состояние.
Кирилл подчеркивает, что переход по состоянием, возможен только через события иначе это будет просто явно выделенное состояние, что уже лучше чем просто флаги.
К сожалению, я не запомнил или не услышал четкого определения, что такое конечные автоматы, поэтому обратилсяк ЖПТ чату, и просто отправлю его определение:
Конечные автоматы (или конечные автоматы с дискретным состоянием) — это математические модели, которые используются для описания поведения систем с конечным числом состояний. Они часто применяются в различных областях, включая теорию формальных языков, проектирование компиляторов, обработку текстов и многое другое.
В контексте PHP конечные автоматы могут использоваться для реализации логики, связанной с обработкой состояний, например, для валидации пользовательского ввода, управления потоками данных или обработки событий.
Основные компоненты конечного автомата:
Состояния: Конечный автомат может находиться в одном из нескольких состояний.
Начальное состояние: Состояние, в котором автомат начинает свою работу.
Состояния переходов: Правила, определяющие, как автомат переходит из одного состояния в другое на основе входных данных.
Входные символы: Данные, которые приводят к переходам между состояниями.
Конечные состояния: Состояния, в которых автомат может завершить свою работу.
Пример реализации конечного автомата на 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)!
Читать дальше...