Сократить область ответственности фичи. Реализовать фабрику сервисов для получения данных
sk1e opened this issue · comments
На данный момент фичи содержат слой по работе с получением данных, который:
- невозможно шарить между фичами в случае если им нужны свои данные на один и тот же запрос. Его можно только копипастить, а на практике выносится в отдельный сервис;
- нагружает код модуля по проброске данных из одной фичи в другую в случае если данные шарятся между несколькими фичами;
- содержит в себе огромный бойлерплейт который приходится писать руками и который легко можно генерировать программно.
Из 1 и 2 следует что этот слой находится не на своём месте и его нужно вытащить на другой уровень.
Предлагаю реализовать генератор фабрики сервисов который принимает сервис API и генерирует фабрику сервисов получения данных .
Сгенерированная фабрика будет импортироваться компонентами модулей, принимать канал получения данных с ассоциированными с этим каналом методами получения данных и возвращать сервис с полностью сгенерированным слоем по работе с redux стейтом, который сейчас пишется руками.
Канал получения данных -- абстракция соотвествующая ветке в redux стейте.
Сервис будет передаваться в фичу, предоставляя ей все селекторы, экшен диспатчеры, экшен тайпы.
Таким образом:
- мы сохраним всю гибкость и полностью автоматизируем работу со стейтом по загрузке данных;
- упростим стейт фичи выпилив все ветки communication, data, edit и ui. Там останется только стейт за который сейчас отвечают ветки edit и ui, что одно и то же по сути.
Звучит круто
Честно, слабо понял в итоге предлагаемое решение, думаю, что тут все-таки нужен совсем минималистичный пример и на нём все это обсудить предметно
В деталях надо продумать, но обобщённо 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>
)
}
Т.е. оно в связке с фабриками фич из #145 должно работать, т.к. сервис должен поступать на вход самой фичи и должен иметь возможность использоваться в контейнерах, селекторах и сагах
По поводу всех твоих предложений с фабриками, я думаю нужно созвониться небольшой группой. Например @Znack @NikitaRzm @kinda-neat и обсудить это нормально.
По поводу всех твоих предложений с фабриками, я думаю нужно созвониться небольшой группой. Например @Znack @NikitaRzm @kinda-neat и обсудить это нормально.
Позовите плиз послушать, если такое случится)
Позовите плиз послушать, если такое случится)
Если есть что сказать, то можно не только послушать :)
ок, но пока такое не намечается))
НУ в целом интересно, давайте обсудим как-нибудь по моему приезду
Меня тоже на созвон возьмите плз, если таковой состоится