fullstack-development / react-redux-starter-kit

Modular starter kit for React+Redux+React Router projects.
https://demo.fullstack-development.com/
MIT License
91 stars 13 forks source link

Сократить область ответственности фичи. Реализовать фабрику сервисов для получения данных #146

Open sk1e opened 4 years ago

sk1e commented 4 years ago

На данный момент фичи содержат слой по работе с получением данных, который:

  1. невозможно шарить между фичами в случае если им нужны свои данные на один и тот же запрос. Его можно только копипастить, а на практике выносится в отдельный сервис;
  2. нагружает код модуля по проброске данных из одной фичи в другую в случае если данные шарятся между несколькими фичами;
  3. содержит в себе огромный бойлерплейт который приходится писать руками и который легко можно генерировать программно.

Из 1 и 2 следует что этот слой находится не на своём месте и его нужно вытащить на другой уровень.

Предлагаю реализовать генератор фабрики сервисов который принимает сервис API и генерирует фабрику сервисов получения данных .

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

Канал получения данных -- абстракция соотвествующая ветке в redux стейте.

Сервис будет передаваться в фичу, предоставляя ей все селекторы, экшен диспатчеры, экшен тайпы.

Таким образом:

  1. мы сохраним всю гибкость и полностью автоматизируем работу со стейтом по загрузке данных;
  2. упростим стейт фичи выпилив все ветки communication, data, edit и ui. Там останется только стейт за который сейчас отвечают ветки edit и ui, что одно и то же по сути.
kinda-neat commented 4 years ago

Звучит круто

Znack commented 4 years ago

Честно, слабо понял в итоге предлагаемое решение, думаю, что тут все-таки нужен совсем минималистичный пример и на нём все это обсудить предметно

sk1e commented 4 years ago

В деталях надо продумать, но обобщённо API будет выглядеть так:

function ModuleComponent(props: IProps) {
  const someFeatureInstance = someFeatureFactory(
    'feature-instance-name',
    {
      // создаём сервис с получением данных по:
      // - приватному каналу для инстанса фичи с запросами getSomeData и getAnotherData;
      // - публичному каналу для группы инстансов одной или разных фич, с запросами getSomeSharedData и getAnotherSharedData.
      dataService: dataServiceFactory({
        'some-feature:feature-instance-name': ['getSomeData', 'getAnotherData'],
        'shared-things': ['getSomeSharedData', 'getAnotherSharedData'],
      }),
    });

  const SomeContainer = useContainer(
    'SomeContainer',
    someFeatureInstance,
  );

  return (
    <div className={b('layout')()}>
      <SomeContainer />
    </div>
  )
}

Т.е. оно в связке с фабриками фич из https://github.com/fullstack-development/react-redux-starter-kit/issues/145 должно работать, т.к. сервис должен поступать на вход самой фичи и должен иметь возможность использоваться в контейнерах, селекторах и сагах

in19farkt commented 4 years ago

По поводу всех твоих предложений с фабриками, я думаю нужно созвониться небольшой группой. Например @Znack @NikitaRzm @kinda-neat и обсудить это нормально.

chmnkh commented 4 years ago

По поводу всех твоих предложений с фабриками, я думаю нужно созвониться небольшой группой. Например @Znack @NikitaRzm @kinda-neat и обсудить это нормально.

Позовите плиз послушать, если такое случится)

in19farkt commented 4 years ago

Позовите плиз послушать, если такое случится)

Если есть что сказать, то можно не только послушать :)

chmnkh commented 4 years ago

ок, но пока такое не намечается))

Znack commented 4 years ago

НУ в целом интересно, давайте обсудим как-нибудь по моему приезду

Zarwlar commented 4 years ago

Меня тоже на созвон возьмите плз, если таковой состоится