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

Repository и единый источник истины

Офлайн-чтение, обновление кеша и конфликты записей

Один путь чтения

Repository определяет политику работы с данными: откуда читать, как обновлять и что считать актуальным. В рассматриваемой offline-first модели UI наблюдает локальную базу. Сеть обновляет базу, а изменения доходят до UI через тот же путь чтения. Это уменьшает риск расхождения сетевого результата и локального кеша. Offline-first.

UI читает локальное хранилище через Repository; сеть обновляет это хранилище

Разделите наблюдение и обновление

interface NotesRepository {
    fun observe(): Flow<List<Note>>
    suspend fun refresh()
}

Здесь Flow — kotlinx.coroutines.flow.Flow, Note — доменная модель приложения. refresh не отдаёт UI независимую вторую копию данных, а записывает результат в локальный источник. Ошибка сети может сосуществовать с доступным кешем: не стирайте полезное содержимое только ради флага ошибки. Offline-first.

Источник истины не устраняет конфликты

Сервер и устройство могут принять разные изменения офлайн. Нужна явная политика: версия записи, конфликт с ручным выбором, last-write-wins с оговорками или предметное слияние. Один Repository сам по себе не превращает эти операции в транзакцию.

В нашем сценарии список с сервера заменяется в базе атомарно, а повторная отправка использует прежний ID операции. Это решения для заданных требований; для совместного редактора может понадобиться другая модель согласования.

Цена дополнительного слоя

Repository полезен, когда скрывает политику данных. Use case добавляют ради сложной или повторяемой логики; одноимённая прокладка для каждого метода не является обязательным условием хорошей архитектуры. Domain layer.

Основа отбора: draft/Architecture interview.md, draft/M++.md, draft/faq500.md.

К вопросам →