Что такое стейт-менеджер (СТМ), кто-нибудь видел определение? Откуда этот термин вообще взялся и за что отвечает?
(я не знаю, буду благодарен если поделитесь)
Но, давайте попробуем описать свойства СТМ и вывести из них определение.
Стейт-менеджер, очевидно из названия, ответственен за управление каким-то состоянием, т.е. в нем описаны обстоятельства перехода одного состояния в другое.
Это описание может быть реализовано разными способами:
- прямой доступ к данным в представлении ЯП (MobX)
- собственный язык запросов (?Datalog)
- предподготовленные запросы (похоже на хранимые процедуры)
предподготовленные запросы можно разделить на:
- курсор (ну например github.com/artalar/pathon)
- линза (github.com/calmm-js/kefir…)
- метод (ООП)
- action (Flux)
- таблица переходов (конечный автомат).
(способы переходов отсортированы от императивщены к декларативщене)
Но это еще не все, практика подсказывает, что, помимо чтения и записи, необходимо реагировать на изменения и кмк именно тут начинается главная работа СТМ.
Дело в том что самое сложное - это именно определение того что изменилось. Часто, в зависимости от того каким образом автор СТМ решил определять изменения, будет выбран тот или иной тип описания изменений - это очень связанные вещи (хотя и не абсолютно).
Типы определения изменений:
- паттерн заместитель (прокси и геттеры с сетерами) для перехвата каждой записи
- подписка на предподготовленные запросы
- сравнение результата (иммутабельность)
(возможно я еще что-то не учел)
При этом библиотека может использовать те или иные типы в разных комбинациях или как-то частично. В рамках твиттера все это расписать, конечно, невозможно, приведу лишь список встретившихся мне СТМ (все они достаточно оригинальны): gist.github.com/artalar/e5e8a7…
Выше я вкратце, но на сколько возможно полно, описал то с чего СТМ начинается. Кажется, все уже достаточно не просто, а это лишь совсем поверхностная теория.
Но давайте подведем какой-то итог.
Стейт-менеджер (СТМ) - это реактивная база данных.
Может быть не совсем прямолинейный вывод, но в рамках твиттера остановимся на этом 👀