Я сейчас читаю "Code Complete" Стива МакКоннелла. В разделе 13.3 "Глобальные данные" в последнем абзаце "Не делайте вид, что вы не используете глобальные данные, помещая все ваши данные в объект-монстр и передавая его повсюду", он сказал:
Размещение всего в одном огромном объекте может соответствовать букве закона, поскольку позволяет избежать глобальных переменных, но это чистые накладные расходы, не дающие никаких преимуществ истинной инкапсуляции. Если вы используете глобальные данные, делайте это открыто. Не пытайтесь замаскировать их с помощью тучных объектов.
Применим ли этот момент к таким инструментам, как Redux во front-end? Если это накладно, так стоит ли использовать просто globalThis
или Window
объект для открытого хранения глобальных переменных (или состояния)? Если у нас уже есть все необходимое для правильной (открытой) работы персонала, то почему появились такие инструменты как Redux, Mobx и т.д.?
Проблема с глобальными переменными заключается в том, что о них трудно рассуждать. Где изменяется эта глобальная переменная? Как вы можете об этом узнать?
Когда вы передаете контекстный объект (т.е. пучок состояний), вам нужен какой-то механизм для контроля доступа. Простая передача объекта-бога без наличия интеллектуальных возможностей доступа не особенно полезна. Именно это имеет в виду Макконнелл, когда говорит об объектах-"монстрах".
Думайте о Redux как об "умных глобальных переменных". В некотором смысле, это не новая идея; базы данных, по сути, являются постоянным хранилищем для гигантских глобальных переменных, за исключением того, что вы получаете всевозможные новые возможности: ACID транзакции, индексирование, запросы и так далее.
На сайте Redux описаны некоторые из возможностей, которые дает этот подход:
Централизация состояния и логики вашего приложения позволяет использовать такие мощные возможности, как отмена/повтор и сохранение состояния.
Он служит централизованным хранилищем для состояния, которое должно использоваться во всем приложении, с правилами, гарантирующими, что состояние может быть обновлено только предсказуемым образом.
Паттерны и инструменты, предоставляемые Redux, облегчают понимание того, когда, где, почему и как обновляется состояние в вашем приложении, и как поведет себя логика вашего приложения, когда произойдут эти изменения.
В Vue есть похожий механизм.