Что такое Стейт Менеджер для вас?
Чтоб вы поняли мою точку зрения, мне придется зайти с далека, чтобы вас ввести в свой контекст. Буду говорить просто и квадратно, и можно зацепиться за любое предложение и опровергнуть его.
Так вот начнем с далека. Человек изобрел транзистор. Из них собрали регистры, логичейские гейты AND, OR, XOR и пошла поехала булевая логика. Еще чутка напряглись и собрали калькуляторы и компьютеры. Поняли, что считает эта штука быстрее человека, и надо туда засовывать всё больше и больше вычислительной логики.
В 50-ых минули времена инструкций и чистого ассемблера, придумали языки программирования высокого уровня, типа Fortran, который позволял людям быстрее писать программы. Завезли туда переменные (VARIABLES) и начали писать безумные алгоритмы вычисления.
Так активно писали, что где-то в 60х запарились и придумали функции (FUNCTIONS), чтоб изолировать/инкапсулировать куски логики и алгоритмов. Привет функциональному подходу из 60х.
В 70x годах в языке Simula появились принципы Объектно Ориентированного Программирования – наши любимые классы и инстансы (CLASS). Просто логика стала настолько активно расти, что пришлось ряд переменных и функции, которые их обслуживают, объединять и инкапсулировать в новую сущность – класс. Привет ООПшникам из 70х.
Где-то в 80-ых стали активно развиваться параллельные вычисления. Народ намучился с синхронизацией состояния. И появился паттерн Наблюдатель (Observable), который позволяет объекту получать оповещения об изменении состояния других объектов.
В 90х появился HTML. А чуть позже появился JavaScript (в 1995). Событие по знаковости, как в 50-ых появились языки программирования высокого уровня. Даешь странички с примитивной типографикой и гиперссылками!
Ах да, и большинство наших зрителей появились тоже в 90х. Привет вам всем огромный.
В нулевых появился Gmail (2004) – первый SPA (Single Page Application). Началась эра веб-клиентов с богатой логикой на своей стороне. Событие по знаковости, как в 60-ых появились функции. Даешь больше логики на клиенте!
В 10ых стали появлятся Angular, Ember, React и прочие. Событие по знаковости, как в 70-ых появились классы. Стока много кода и логики, надо все объединять, собирать и структурировать. Давай фреймворки в браузеры!
Ну и к 20 году мы с вами заговорили о Стейт Менеджерах. Событие по знаковости, как в 80-ых появились параллельные вычисления и паттерн Observable. Мы замучались синхронизировать состояние в разных частях приложения. Даешь синхронизацию, даешь Стейт Менеджеры!
Т.е. история развивается по спирали. Фронтендеры – это бэкендеры со сдвигом в 40-50 лет, которые смогли начать программировать только в 2000х годах.
Так что такое Стейт Менеджер? Все до банальности просто:
- это одна или несколько переменных из 50х (например адресная строка в браузере)
- набор функции из 60х, либо класс из 70х (например History API, которые позволяет менять адресную строку)
- и паттерн Observable из 80х (например event handler window.onpopstate) Всё это взяли объединили и получили BrowserHistory (который используется к примеру в React Router) - примитивный стейт менеджер, который позволяет управлять браузерной строкой и подписываться на ее изменения.
Итак, джентельменский набор любого стейт менеджера это - набор переменных, набор функций для изменения этих переменных и какой-нибудь Observable, который позволяет вам подписаться на изменения этих самых переменных.
И всякие там истории предыдущих состояний, иммутабельность, реактивность, потоки, EventEmitter, декораторы, thunk'и, хождение по сети за данными – это все сахар, ну или разновидности имплементации стейт менеджеров.
Переменная + Функция + паттерн Observable = вот оно мое базовое определение Стейт Менеджера. Ну а сверху уже добавляются разный примочки под определенные задачи.
Полностью с вами согласен. Мысль очень точная.