Como sair de código centrado em tela e tabela para uma arquitetura centrada em linguagem de negócio, contextos delimitados, comportamento e responsabilidade.
Toda equipe já viu software que funciona no banco, mas falha no significado.
O time constrói rápido: telas, CRUD, endpoints e tabelas. Tudo parece organizado. Só que cada área chama “cliente”, “meta”, “pedido” e “produto” por nomes parecidos com significados diferentes.
O mesmo termo aparece em vários lugares com regras conflitantes e o código passa a depender de exceções espalhadas.
Relatórios divergem, integrações quebram, e qualquer mudança exige conhecer o sistema inteiro.
Programação por domínios organiza o software segundo o negócio real, não segundo a conveniência do framework.
Domínio é o problema de negócio que o software precisa compreender e operar.
Domínio não é “banco de dados”, “API” ou “tela”. Domínio é o conjunto de conceitos, regras, exceções e decisões do negócio.
Domain-Driven Design é projetar software a partir do modelo de negócio e da linguagem que dá sentido a ele.
Domain no projeto.DDD vale especialmente quando o problema tem regra, exceção, ambiguidade e mudança frequente.
Se o time e o negócio não usam a mesma linguagem, o código vira tradução defeituosa.
A linguagem ubíqua é o vocabulário compartilhado entre pessoas de produto, negócio e engenharia. Os nomes usados na conversa devem aparecer também no código, nos eventos, nos casos de uso e na documentação.
DataServiceGenericManagerUpdateStatus() sem explicar qual status de qual processoMetaMensal, IndicadorDeTurnover, FecharCicloDeAvaliacao(), ExportarRelatorioGerencial().
Quando a linguagem muda, o modelo também precisa mudar.
“Produto” pode significar catálogo comercial, item faturável ou linha analítica. Tentar unificar tudo à força gera ruído e acoplamento.
Bounded Context é a fronteira dentro da qual um termo tem significado consistente.
DDD não obriga microservices. Ele exige fronteiras claras.
| Modelo | Problema ou ganho | Leitura correta |
|---|---|---|
| Monolito acoplado | Uma mudança em RH quebra relatórios, billing e dashboard. | O problema não é ser monolito; é não haver limites de contexto. |
| Monolito modular | Módulos internos têm linguagem e dependências mais controladas. | Pode ser excelente para times pequenos e médios. |
| Microservices | Amplificam autonomia, mas também complexidade operacional. | Devem surgir quando o contexto e a equipe justificam a separação física. |
Os domínios se relacionam, mas não devem perder suas responsabilidades centrais.
O objetivo não é decorar nomes. É saber onde colocar responsabilidade.
Tem identidade e ciclo de vida. Ex.: colaborador, meta, ciclo de avaliação.
Vale pelos atributos, não por identidade. Ex.: período, faixa salarial, e-mail.
Comporta regra importante que não cabe naturalmente em uma única entidade.
Abstrai acesso à persistência sem contaminar o núcleo com detalhes de banco.
Se tudo vira entidade, o modelo fica pesado. Se nada vira entidade, o modelo perde continuidade.
Funcionario continua sendo o mesmo mesmo com nome ou salário atualizados.PeriodoCompetencia, EmailCorporativo, Moeda.Agregado é um limite de consistência. Nem tudo que se relaciona precisa ser salvo junto.
CicloDeAvaliacao pode ser a raiz que controla metas, avaliações e fechamento.
Um relatório consolidado pode ler esse conjunto, mas não faz parte do mesmo agregado operacional.
Regra prática: o que precisa mudar junto com consistência forte tende a viver no mesmo agregado.
Misturar coordenação técnica com regra de negócio é um dos erros mais comuns.
| Tipo | Responsabilidade | Exemplo |
|---|---|---|
| Serviço de Domínio | Expressa regra de negócio que depende de mais de uma entidade ou conceito. | CalcularIndicadorDeTurnover |
| Serviço de Aplicação | Orquestra caso de uso, transação, autorização e chamadas externas. | GerarRelatorioGerencialUseCase |
| Infraestrutura | Resolve persistência, mensageria, API externa, cache. | FuncionarioRepositorySql |
O domínio deve conhecer o negócio. Não deve conhecer HTTP, EF, controller ou banco.
O projeto de domínio deve ser o lugar mais estável e semanticamente forte do sistema. Quanto mais regra vai para controller ou SQL solto, mais o domínio desaparece.
Integrar não significa importar o modelo do outro sistema para dentro do seu núcleo.
Um sistema legado chama um indicador de score, outro chama de rating,
e o time começa a replicar nomes e regras incoerentes dentro do projeto.
A ACL traduz contratos externos para a linguagem do seu domínio, evitando contaminação conceitual.
Telas mudam rápido. Capacidades de negócio tendem a durar mais.
TelaDashboardServicePageFilterManagerConsolidarIndicadoresMensaisFecharCicloDeAvaliacaoCompararMetaPlanejadaComRealizadaO front-end consome capacidades. Ele não deveria definir a ontologia do sistema.
Nem toda modelagem precisa ser fortemente normalizada se a leitura de negócio pedir outro formato.
O objetivo é mapear contextos reais do dashboard e separar seus significados.
O mesmo dado pode aparecer em mais de um contexto, mas com responsabilidades e linguagem distintas.
Desenhar o domínio antes de codar mais uma tela.
Se a mesma palavra aparece em três partes do sistema com significados diferentes, você está diante de um termo “genérico” ou de três contextos diferentes que ainda não foram explicitados?