A Arquitetura Limpa separa o que o app faz (entidades, casos de uso) de como ele fala com o mundo (adaptadores). No React Native, isso significa casos de uso testáveis em TypeScript - não fábricas abstratas para cada clique de botão.
Caso de uso por clique de botão - Centenas de "casos de uso" de uma linha adicionam ruído. Correção: Casos de uso para intenções multi-etapas; mantenha toggles triviais em hooks.
Portas para tudo, incluindo Date.now() - Abstraia o tempo apenas quando testes provarem instabilidade. Correção: Injete relógios apenas em fluxos de pagamento/expiração.
Lançar erros entre camadas - Chamadores não conseguem distinguir falhas de rede de validação. Correção: Retorne uniões discriminadas ({ ok: false, error: "network" }).
Hooks que chamam fetch diretamente - Ignora casos de uso; testes precisam de MSW para cada tela. Correção: Mova IO para adaptadores; hooks chamam casos de uso.
Entidades importando adaptadores - Inverte a regra de dependência. Correção: Adaptadores importam tipos de entidade; casos de uso dependem de interfaces de porta.
domain/ monolítico compartilhado entre todas as features - Torna-se um monólito. Correção:domain/ por feature, a menos que a entidade seja verdadeiramente global (User → entities/user).
TanStack Query dentro de casos de uso - Query é uma preocupação de cache de apresentação. Correção: Caso de uso retorna dados; hook ou adaptador de repositório alimenta o cliente de query.
A Arquitetura Limpa é um exagero para o React Native?
Cerimônia completa é um exagero para apps pequenos. Adote entidades + casos de uso + adaptadores para features com regras de negócio reais (autenticação, pagamentos, sincronização offline). Listas CRUD podem continuar com hook + módulo de API.
Onde vivem os casos de uso?
Dentro da feature: src/features/auth/domain/use-cases/. Regras entre features pertencem a src/entities/<nome>/ ou um pacote de domínio compartilhado.
Preciso de interfaces para todos os adaptadores?
Adicione uma interface de porta quando tiver duas implementações (API ativa + mock, ou REST + GraphQL). Um único adaptador pode usar um tipo concreto até que a segunda implementação exista.
Como isso funciona com o Expo Router?
Rotas permanecem finas. SignInScreen recebe onSignedIn da rota; navegação é uma preocupação da camada externa - não dentro do caso de uso.
Casos de uso devem retornar entidades ou DTOs?
Retorne entidades ou tipos de resultado específicos da feature. Mapeie DTOs de API para entidades dentro dos adaptadores - formas de DTO nunca vazam para a UI.
Casos de uso podem chamar outros casos de uso?
Sim, componha-os - checkout pode chamar validateCoupon e reserveInventory. Mantenha a composição em um caso de uso pai, não na UI.
Onde o Zustand se encaixa?
Zustand armazena estado da UI do cliente ou um cache de sessão atualizado por resultados de casos de uso. Não coloque lógica de fetch dentro de ações de store - chame casos de uso a partir das ações em vez disso.
Como testar o signIn sem um dispositivo?
Passe objetos AuthGateway e TokenStorage falsos para signIn(). Afirme sobre a união discriminada - nenhum renderizador é necessário.
E a sincronização offline-first?
Modele SyncQueue como uma porta. O caso de uso enqueueMutation escreve no adaptador de fila; o adaptador de worker em segundo plano esvazia a fila - a UI chama casos de uso, não SQLite diretamente.
O Redux é uma camada de arquitetura limpa?
Redux é estado de infraestrutura/apresentação. Casos de uso não devem despachar ações do Redux - hooks despacham após o sucesso dos casos de uso.
Qual a diferença para o FSD?
FSD é taxonomia de pastas. Arquitetura Limpa é direção de dependência dentro dessas pastas. Use segmentos FSD (domain/, adapters/) para hospedar anéis limpos.
Quando devo extrair entidades para src/entities/?
Quando duas ou mais features importam o mesmo substantivo (User, Order). Entidades locais da feature permanecem em features/<nome>/domain/ até serem compartilhadas.
Preciso de DI estilo Dagger/Hilt?
Não. Funções fábrica simples e contexto React são suficientes - veja Injeção de Dependência em RN.
Quantas linhas antes de um hook se tornar um caso de uso?
Contagem de linhas é um sinal fraco. Extraia quando o hook mistura IO + regras de negócio com ramificações + estado de UI e testes exigem montagem do React - tipicamente 40+ linhas de orquestração.