Логика государственного управления

1656585976 logika gosudarstvennogo upravleniya

автор Огуз Гелал

Стандартизация управления состоянием транзакций принесла предсказуемость разработке интерфейса. Затем с неизменностью и единственным источником истины для состояния программы стали более удобными и надежными. Однако все еще существует некоторая неясность по поводу того, что делать с бизнес-логикой.

Я предлагаю модель, где бизнес-логика управляется тем же командным каналом, который используют редукторы.. Управление логикой с помощью тех же однонаправленных транзакций приносит много преимуществ при разработке. Сначала я расскажу проблему более подробно. Затем я объясню, как работает эта модель Восстановить, библиотека, реализующая эту модель Напоследок я обсудю некоторые из этих преимуществ.

1*oKxDqn4H2eJmxuNI8GY0Kg
На примере запроса с Reclare и React-Reclare

Вечная борьба с данными

Сначала люди создавали пользовательские интерфейсы с помощью простого HTML и CSS. Они обрабатывали манипуляцию DOM (объектная модель документа) с помощью JavaScript или jQuery. Тогда это было разумно — интерфейсные приложения были простыми, а не управлявшими данными. Но потом ответственность переросла в получение и обработку данных, а не только на их отображение. Манипулирование DOM утратило свою целесообразность.

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

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

Redux совершил прорыв с неизменностью и единственным источником истины для государства. Он представил гибкие, чистые, функциональные и композиционные редукторы. Это принесло определенные преимущества перед архитектурой Flux, но все еще существует некоторая неясность относительно того, как обращаться с бизнес-логикой и где она должна жить. Есть много статей и дискуссий по этой теме, но четкого ответа, кажется, нет.

Это смутило меня так же, как и других. Я решил решить эту проблему и найти чистый способ обработки бизнес-логики в моих программах. Тогда у меня возникла идея объединить бизнес-логику вместе с редукторами. Это позволило логике работать вместе с редукторами в одном канале событий.

Я понял, что такой подход принес больше, чем некоторые организационные преимущества. Это принесло другие преимущества, такие как предсказуемость и декларативность в логике. Появилась потребность в библиотеке, чтобы вместе с государством организовать логику и поддерживать все преимущества современного государственного управления. В это время я решил создать Reclare.

Краткое вступление в Reclare

Reclare – это простая библиотека, которая вращается вокруг декларации и события. Объявление – это простой объект, который может вызвать Reclare. Оно описывает ситуационное состояние чтобы он вызвал, и что делать если имеет место его вызов. Его реакцией может быть обновление состояния, выполнение логики/побочных эффектов или и то, и другое. Вот как выглядит декларация:

Просмотрите пример на JSFiddle

Это общий API, и есть разные виды деклараций. Различные виды вызываются разными способами. Есть два вида: объявления событий и подписки.

Объявление событий слушать канал событий и подписываться на конкретные события. The broadcast метод можно использовать для трансляции событий по каналу событий. Первым параметром является ключ события, а затем полезная нагрузка события. Эта полезная нагрузка передается в функции объявления.

broadcast("event_key", { bar: 'foo' })

Декларации о подписке вызывается при каждом изменении состояния. В зависимости от типа объявления функции могут получать дополнительные параметры, но структура не меняется.

Когда создается контекст Reclare, все объявления объединяются с помощью их on ключи. Это уменьшает сложность поиска деклараций в трансляции до времени O(1). Это также делает работу с объявлениями очень природной, поскольку можно иметь несколько деклараций с одним ключом события. Вот пример:

1*j1kB4R-zfkbXH4DvlKBlZw
Жизненный цикл вызова объявления

Жизненный цикл декларации

Жизненный цикл декларации начинается, когда запускается одна или несколько деклараций. Во-первых, все ситуационные функции всех деклараций, в которых транслируется событие on ключ оценивается. Если ситуационное условие выполняется, то редукторы и реакции этого объявления становятся в очередь. Затем начинают выполняться редукторы в очереди.

Каждый из них получает состояние и возвращает новое состояние, которое затем передается следующему. Каждый редуктор запускает объявление подписки. Они получают состояние до и после запустившего их редуктора. Далее выполняются реакции в очереди. Каждая реакция получает в качестве аргументов исходное и текущее состояние. Они выполняются после редукторов, поэтому состояние, которое они получают, окончательно. Полезная нагрузка события передается каждой функции, выполняемой на каждом шагу.

Преимущества

Современные библиотеки управления состоянием сосредоточены только на управлении состоянием программы. Логику за кулисами обычно не замечают. Есть преимущества в сочетании государства и бизнес-логики. Понятно, что между ними должно быть разделение. Примеси и побочные эффекты логики следует держать подальше от управления государством. Но они функционально принадлежат друг другу, потому должны сосуществовать и действовать вместе.

Предполагаемая логика

Управление бизнес-логикой с помощью одних и тех же направленных транзакций с помощью редукторов обеспечивает такую ​​же предсказуемость логике, что и государству. Это облегчает рассуждение, следование, понимание и тестирование кода.

Предсказуемость в контексте бизнес-логики — это не сравнение один на один с предсказуемостью государства, но основная идея одна и та же. Трансляция событий может быть записана с их полезной нагрузкой и вызываемыми ими вызовами. Таким образом, можно вернуться в историю событий, чтобы рассказать, что произошло во время исполнения. Вы можете изучить, какие декларации были вызваны, какие реакции они выполняли и как они изменили состояние.

Структура и фрагментация кода

Типовая передняя кодовая база содержит много разных типов сущностей. Например, типовая кодовая база React+Redux+redux-saga будет иметь контейнеры, компоненты, действия, редукторы, типы, селекторы, саги, сервисы и другие, в зависимости от выбора библиотек. Дэн Абрамов упоминает в своей статье Redux вам может не понадобиться:

Люди часто выбирают Redux, прежде чем им это понадобится. «Что, если наше приложение не масштабируется без него?» Позже разработчики не хмурились, глядя на опосредованность, которую Redux ввел в их код. Почему я должен касаться трех файлов, чтобы заработать простая функция? Действительно почему!

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

Повторите попытки сделать это испытание более приятным декларации и файлы утки.

Объявление – это связи, которые содержат редукторы вместе с реакциями. Поскольку они выполняются на одном событии, они будут уместны функционально.

The утиные файлы Подход основан на модульном возведении уток Эрика Расмуссена. Это предложение объединить разбитые куски Redux как изолированный модуль.

Reclare по-своему придерживается этой модели. Он позволяет объединять декларации и другие соответствующие объекты в один файл. Кроме того, он поддерживает композицию, позволяя иметь логические отношения между родителями и детьми. Файлы Duck могут экспортировать другие объекты, например константы и селекторы. Это простой, но удобный способ разделить код на модули.

Модульность и декларативность

Reclare управляет как редукторами, так и реакциями вместе с однонаправленными транзакциями. Это позволяет выстроить свою логику в декларативном и модульном характере. Я объясню простым сценарием входа:

Трансляция компонента формы входа login_submitted с электронной почтой и паролем при отправке. Он также получает статус загрузки в props, обрабатываемом модулем запроса ниже.

Выше расположен модуль, управляющий процессом входа. Вызывается первая декларация login_submitted если введенные данные действительны. Он транслирует on_request событие с деталями запроса. Обратите внимание, как он совсем не заботится об обработке запросов? Модуль интересует только результат запросов типа login.

Следующие две декларации слушают request_success и request_fail события. После этих событий, если условия типа запроса выполняются, они будут вызваны. Первый сохраняет пользователя в состоянии и запускает изменение маршрута, а второй показывает сообщение об ошибке.

Это пример модуля общего назначения, обрабатывающего запросы и состояния загрузки. Вызывается первая декларация on_request событие. После вызова он установит состояние загрузки типа запроса, а затем начнет запрос. Затем на основе результатов будет транслироваться request_success или request_fail события. Также будет транслироваться request_resolvedчто завершает состояние загрузки.

Из этого примера есть два вывода. Во-первых, как управляется бизнес-логика. Большинство библиотек управления состоянием, использующими однонаправленные потоки данных, позволят управлять состоянием декларативно. Но с помощью Reclare вы также можете воспользоваться преимуществами этого шаблона для управления своей бизнес-логикой.

Во-вторых, это модульность. Каждая декларация и модуль представляют собой изолированный фрагмент кода, который вызывается определенными событиями. Объявления получают полезную нагрузку и делают свое дело: выполняют набор действий и/или обновляют состояние. Они не знают и не подвергаются влиянию других частей кода.

Это поможет вам сохранить ментальное отображение вашего кода, даже когда он масштабируется. Это также приносит много преимуществ при тестировании вашего кода.

Заключительные слова

Поскольку я завершил внедрение и тестирование Reclare, я несколько раз использовал его для вспомогательных проектов и производственных сред на работе. Пока это был веселый опыт, и я не имел ничего, кроме успеха. Я искренне надеюсь, что Reclare сможет помочь сообществу так же, как и мне.

И последнее: есть официальное промежуточное программное обеспечение React, созданное поверх нового Context API. Когда я писал статью, Reclare был готов к использованию в проекте React. Его можно использовать без промежуточного программного обеспечения в любом проекте JavaScript. Я рассмотрю создание промежуточного программного обеспечения для других фреймворков (если кто-нибудь другой не хочет это сделать?).

Что касается планов на будущее, то здесь краткосрочные дорожная карта:

  • Создание Reclare DevTools для отладки
  • Я тоже буду изучать интеграцию Redux DevTools
  • Больше документов и примеров
  • Рекомендации по вкладу
  • Поддержка TypeScript
  • Тесты и улучшения React-Reclare
  • Возможность расширения API декларации
  • reducerDefault/reactionDefault

Вы также можете найти несколько примеров в хранилищах:
Восстановить — https://github.com/reclarejs/reclare
React-Reclate

1*HXQqXwNsWy3_D7kFgEHgwg

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *