ADR-0007 — Padrão de Organização de Código
Status
Aprovado
Contexto
O sistema EBDbe será desenvolvido utilizando:
- Flutter Web (frontend)
- Firebase + Cloud Functions (backend)
Para evitar acoplamento excessivo, código desorganizado e crescimento caótico, é necessário definir um padrão estrutural claro para organização do código.
A estrutura deve:
- Separar responsabilidades
- Isolar domínio de infraestrutura
- Facilitar testes
- Permitir crescimento modular
- Ser compreensível para novos colaboradores
Decisão
O projeto adotará organização baseada em princípios de Clean Architecture simplificada, separando claramente:
- Domain
- Application
- Infrastructure
- Presentation (frontend)
- Interfaces (backend)
1. Estrutura do Frontend (Flutter)
Estrutura oficial:
frontend/ └── lib/ ├── core/ ├── domain/ ├── application/ ├── infrastructure/ ├── presentation/ └── shared/
1.1 domain
Contém:
- Entidades
- Value Objects
- Regras puras de domínio
- Interfaces abstratas
Não pode depender de Firebase ou Flutter.
1.2 application
Contém:
- Use cases
- Orquestração de regras
- Serviços de aplicação
Pode depender de domain, mas não de infraestrutura concreta.
1.3 infrastructure
Contém:
- Implementações de repositórios
- Integração com Firebase
- Adaptadores externos
Pode depender de domain e application.
1.4 presentation
Contém:
- Widgets
- Controllers
- State management
- Rotas
Pode depender de application.
Nunca deve conter regra de negócio crítica.
1.5 core
Contém:
- Configurações globais
- Inicialização
- Tratamento de erros
- Serviços base
1.6 shared
Contém:
- Componentes reutilizáveis
- Utilitários
- Constantes
2. Estrutura do Backend (Cloud Functions)
Estrutura oficial:
backend/ └── functions/ ├── domain/ ├── application/ ├── infrastructure/ ├── interfaces/ └── shared/
2.1 domain
- Entidades
- Regras puras
- Interfaces de repositório
Não depende de Firebase SDK.
2.2 application
- Casos de uso
- Serviços de validação
- Orquestração de lógica
2.3 infrastructure
- Implementação concreta de acesso ao Firestore
- Integração com Firebase Auth
- Logs
2.4 interfaces
- Entradas HTTP
- Handlers de Cloud Functions
- Validação de requisição
- Mapeamento de DTOs
2.5 shared
- Utilitários
- Tipos comuns
- Constantes globais
3. Regras Estruturais
- Domain não depende de infraestrutura.
- Presentation não contém regra de negócio crítica.
- Backend valida todas as regras finais.
- Nenhuma função acessa Firestore diretamente fora da camada infrastructure.
- Não será utilizado padrão anárquico baseado apenas em “features soltas”.
4. Nomeação
- Pastas internas em inglês.
- ADRs em português.
- Classes e arquivos em inglês.
- Entidades com nomes claros e sem abreviações excessivas.
5. Testes
- Testes unitários para domínio.
- Testes de aplicação.
- Uso do Firebase Emulator para backend.
- Testes não devem depender de produção.
Consequências
- A estrutura impõe disciplina arquitetural.
- Refatorações futuras serão mais seguras.
- Novos colaboradores terão referência clara.
- Crescimento desordenado será evitado.