UDF, reducer и устаревшие ответы
Явные переходы состояния вместо гонок флагов
Действие превращается в состояние
В однонаправленном потоке UI показывает состояние и отправляет действия владельцу логики. Reducer — чистая функция (state, action) -> state; сеть и сохранение выполняются снаружи. MVVM совместим с UDF: имя паттерна не запрещает единый поток данных. Архитектура Android.
Сделайте гонку видимой
Пользователь запросил A, затем B; ответ A пришёл последним. Одной переменной loading мало. Храните ID активного запроса и принимайте результат только от него.
data class SearchState(val requestId: Long, val text: String)
data class Loaded(val requestId: Long, val text: String)
fun reduce(state: SearchState, action: Loaded): SearchState =
if (action.requestId == state.requestId) state.copy(text = action.text)
else state
Это защита состояния по требованиям примера. Отмена старого запроса всё ещё полезна для экономии ресурсов; её наличие не доказывает, что удалённый сервер отменил свой эффект.
Уведомление не равно завершённой операции
Если результат важен после временного отсутствия UI, представьте его состоянием с ID и явным подтверждением обработки. При смене экрана событие без replay может потеряться, с replay — повториться. Гарантию «ровно один раз» нельзя получить одним выбором Channel или SharedFlow. UI events.
Не усложняйте простую форму
Явная модель переходов окупается при конкуренции и сложных инвариантах. Для двух независимых локальных полей формы отдельный reducer-фреймворк может ничего не улучшить. Выбор проверяют читаемостью переходов и возможностью воспроизвести пограничный сценарий.
Основа отбора: draft/Architecture interview.md, draft/faq500.md, draft/patterns.md.