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?
Programação por Domínios · Prof. Afonso
Ao final do encontro, o estudante deve ser capaz de aplicar ao projeto os conceitos de Programação por Domínios. Escopo do encontro: Estruture seu código seguindo os princípios de Domain-Driven Design.
Exposição dialogada dos conceitos, alternada com aplicação guiada ao projeto do grupo, e fechamento com verificação do entendimento.