Boas práticas e padrões · Arquitetura do código · 5 min de leitura
Repository
Uma coleção do domínio que esconde de onde os dados vêm — API, banco local ou cache — e decide a estratégia offline.
Arraste para o lado para ver o diagrama inteiro.
O padrão
Fowler descreve o Repository como uma interface "parecida com uma coleção" para objetos do domínio. Ele concentra a decisão de onde buscar e como manter consistente: cache em memória, banco local, rede.
Offline-first
O guia de arquitetura do Android recomenda o banco local como fonte única da verdade: a UI observa o banco; a rede só atualiza o banco. Resultado: abre instantâneo, funciona sem internet e não tem estados contraditórios.
Boas práticas
- Exponha modelos do domínio, não DTOs nem entidades do Room.
- Funções
suspendpara ações eFlowpara dados observáveis. - Trate erros de rede no repositório e devolva tipos do domínio.
No código
class TarefasRepository(private val dao: TarefaDao, private val api: TarefasApi) {
// a tela observa o banco: abre na hora e funciona offline
val tarefas: Flow<List<Tarefa>> = dao.observarTodas().map { lista -> lista.map(TarefaEntity::paraDominio) }
suspend fun sincronizar(): Result<Unit> = runCatching {
val remotas = api.listar()
dao.substituirTodas(remotas.map(TarefaDto::paraEntity))
}
suspend fun concluir(id: Long) {
dao.marcarConcluida(id) // otimista: a tela já atualiza
runCatching { api.concluir(id) }.onFailure { dao.agendarReenvio(id) }
}
} A UI nunca fala com a API. Se a rede falha ao concluir, a tarefa continua concluída localmente e o envio é reagendado.
Em resumo
- Esconde as fontes de dados atrás de uma interface.
- Banco local como fonte única da verdade.
- Expõe modelos do domínio, não DTOs.
- Flow para observar, suspend para agir.