Архитектура / паттерны · 2 / 4

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.

К вопросам →