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

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

дело.

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

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

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

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

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

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

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


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

3 ответов

10 просмотров

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 стейт экрана и обновляют его.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
5
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта