214 похожих чатов

Кто-Нибудь пытался (успешно делал?) вписать MVI в Clean? Волнует вот какое

дело.

1: Репозиторий довольно чисто, в плане стейтов (не ФП), работает с данными. Просто лезет куда-нибудь в сеть или БД, сохраняет туда сюда, возвращает значения.

2: Интерактор работая с репозиторием(ями) проворачивает это дальше и может иметь свой стейт, который будет уже зависеть от работы репозитория. Вернулись данные с сети? InState.Success. Не вернулись но есть данные с кеша? InState.Cached. Валидация провалилась? InState.ValidationError. И т.д.

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

Как вы с этим боролись?

Вариант с "Один экран - онда фича" ниочём, т.к. экран спокойно может содержать несколько фич, которые внешне на экране обрабатываются как-то вместе.

Вариант с убрать нахер интеракторы интересен, но не всегда возможен, т.к. на чистом клине уже может быть построено всё приложение, что переписывать как-то такое.

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


Плюс такой бонус вопрос к особым любителям MVI, которые его боготворят (тут такие есть ;) ):
Поговаривают, что Feature и является пристанищем бизнес-логики, но эти фичи в стейтах, почти всегда, содержат всякую ерунду вроде "show error", "hide registration button", "selected radio button" и пр., что как-то не очень укладывается в бизнес-логику, а скорее относится к отображению. Считаете это окей?)

3 ответов

13 просмотров

1. Тут ты прав, репозиторий весьма удачно вписывается в MVI, у него есть свой стейт, но он либо прозрачен (это кеш) либо не изменяется по ходу работы приложения (base_url и другие настройки) 2.3. то, что презентер или вьюмодель имеет свой стейт, а интеракторы - свой, как раз таки и нужно искоренить. MVI/TEA без единого стейта фичи и чистых редьюсеров - всего лишь слегка бойлерплейтный MV* паттерн. Если хочется соблюдать тру клин, то храни в стейте бизнесовые модели, а вьюмодели создавай на их основе какой-нибудь фабрикой. В ней и будет "презентационная логика", если угодно. Интеракторы я уже выше предлагал как можно переписать - презентер превратить в медиатор между вью, стейтом, редьюсерами, службами и репозиторием, который связывает это воедино

Не храни данные в интеракторе. Если нужно что то сохранить, то это по сути кеш, и он должен обрабатываться в репе. Для всего остального - фичи/редьюсеры

Да давайте обсудим clean и mvi. Кто как видит трансформацию данных? Я так понял обычно рассматривается 3 слоя, какие нибудь event, update, state или intent result state итд. В стейте получается будут детали отображения как говорилось выше. Получается это не бизнес логика а ui слой. Тогда или редюсеры это ui слой или есть еще один UiState и еще одна сущность которая переводит state в uistate. Можно сделать так что интеракторы содержали репозитории и переводили event в update. Тогда это не чистые функции. И они скрывают детали асинхронной работы. И берут на себя функции всяких postprocessor итд из mvicore. Получается тогда event принадлежит бизнес слою. Или можно сделать еще какой нибудь UiEvent слой. Пока я вижу все так. Reducer берет на себя только подготовку стейта, и он и state это ui слой. Интерактор, event и update это buissness слой. Наверное можно делать несколько цепочек разных usecase и reducer которые изменяют 1 стейт экрана и обновляют его.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта