DDD em quatro pontos
- DDD orienta o desenvolvimento pelo conhecimento do domínio; não é uma arquitetura pronta nem uma estrutura de pastas.
- Linguagem ubíqua e contextos delimitados ajudam a tornar explícitos significados que não cabem em um modelo único.
- Padrões táticos, como entidade e agregado, são ferramentas opcionais para proteger regras relevantes.
- Quando o problema é simples, estável e predominantemente CRUD, uma solução direta costuma ser melhor.
O que é Domain-Driven Design?
Domain-Driven Design
Domain-Driven Design é uma abordagem para desenvolver software em domínios complexos por meio da colaboração entre especialistas do domínio e profissionais de tecnologia, da construção de uma linguagem compartilhada e da criação de modelos delimitados que representem regras relevantes do negócio.
O que DDD não é
DDD e abordagens associadas
A combinação pode ser útil, mas uma escolha não implica automaticamente as demais.
| Abordagem | Questão principal |
|---|---|
Domain-Driven Design | Como compreender e modelar um domínio complexo? |
Arquitetura hexagonal | Como proteger a lógica central de dependências externas? |
Clean Architecture | Como organizar dependências e responsabilidades? |
Microsserviços | Como distribuir implantação e operação entre serviços? |
CQRS | Quando separar modelos de escrita e leitura? |
Event Sourcing | Quando registrar mudanças de estado como sequência de eventos? |
Domain-Driven Design
- Questão principal
- Como compreender e modelar um domínio complexo?
Arquitetura hexagonal
- Questão principal
- Como proteger a lógica central de dependências externas?
Clean Architecture
- Questão principal
- Como organizar dependências e responsabilidades?
Microsserviços
- Questão principal
- Como distribuir implantação e operação entre serviços?
CQRS
- Questão principal
- Quando separar modelos de escrita e leitura?
Event Sourcing
- Questão principal
- Quando registrar mudanças de estado como sequência de eventos?
Três tipos de complexidade
Design estratégico e design tático
Design estratégico: decidir onde cada modelo vale
Design tático: representar regras dentro do modelo
Linguagem ubíqua não é um glossário congelado
Bounded Context: um limite de significado
A mesma pessoa em três contextos
Os modelos compartilham uma referência quando necessário, mas respondem a perguntas diferentes.
| Contexto | Conceito principal | Significado |
|---|---|---|
Comercial | Cliente potencial | Pessoa ou empresa em negociação. |
Execução | Cliente do projeto | Parte que valida o escopo e as entregas. |
Financeiro | Pagador | Responsável por cobranças e pagamentos. |
Comercial
- Conceito principal
- Cliente potencial
- Significado
- Pessoa ou empresa em negociação.
Execução
- Conceito principal
- Cliente do projeto
- Significado
- Parte que valida o escopo e as entregas.
Financeiro
- Conceito principal
- Pagador
- Significado
- Responsável por cobranças e pagamentos.
Context Mapping: como os modelos se relacionam
Relações frequentes entre contextos
A escolha depende de autonomia, poder de decisão, custo de integração e necessidade de preservar o modelo.
| Relação | Quando pode ajudar | Risco importante |
|---|---|---|
Partnership | Duas equipes coordenam evolução e sucesso de uma integração. | Dependência mútua bloquear entregas. |
Shared Kernel | Contextos compartilham deliberadamente uma parte pequena do modelo. | O núcleo crescer e acoplar equipes. |
Customer–Supplier | Um contexto fornecedor negocia necessidades com o consumidor. | Prioridades do fornecedor ignorarem o consumidor. |
Conformist | O consumidor adota o modelo externo porque traduzi-lo não compensa. | O modelo interno ficar limitado pelo externo. |
Anti-Corruption Layer | Uma tradução protege conceitos internos de um modelo externo. | A camada virar uma cópia complexa sem limite claro. |
Open Host Service | Um contexto oferece um protocolo estável para vários consumidores. | Uma interface genérica demais perder significado. |
Published Language | A integração usa uma linguagem documentada e compartilhável. | Contrato e implementação divergirem. |
Separate Ways | Contextos evitam integração quando o custo supera o benefício. | Dados ou comportamentos necessários ficarem inconsistentes. |
Partnership
- Quando pode ajudar
- Duas equipes coordenam evolução e sucesso de uma integração.
- Risco importante
- Dependência mútua bloquear entregas.
Shared Kernel
- Quando pode ajudar
- Contextos compartilham deliberadamente uma parte pequena do modelo.
- Risco importante
- O núcleo crescer e acoplar equipes.
Customer–Supplier
- Quando pode ajudar
- Um contexto fornecedor negocia necessidades com o consumidor.
- Risco importante
- Prioridades do fornecedor ignorarem o consumidor.
Conformist
- Quando pode ajudar
- O consumidor adota o modelo externo porque traduzi-lo não compensa.
- Risco importante
- O modelo interno ficar limitado pelo externo.
Anti-Corruption Layer
- Quando pode ajudar
- Uma tradução protege conceitos internos de um modelo externo.
- Risco importante
- A camada virar uma cópia complexa sem limite claro.
Open Host Service
- Quando pode ajudar
- Um contexto oferece um protocolo estável para vários consumidores.
- Risco importante
- Uma interface genérica demais perder significado.
Published Language
- Quando pode ajudar
- A integração usa uma linguagem documentada e compartilhável.
- Risco importante
- Contrato e implementação divergirem.
Separate Ways
- Quando pode ajudar
- Contextos evitam integração quando o custo supera o benefício.
- Risco importante
- Dados ou comportamentos necessários ficarem inconsistentes.
Subdomínios e investimento
Subdomínios em uma plataforma de serviços
A classificação muda conforme a estratégia e deve ser revisada quando o negócio muda.
| Subdomínio | Possível classificação | Decisão |
|---|---|---|
Definição e controle de escopo | Central | Receber maior atenção de modelagem. |
Acompanhamento das entregas | Apoio ou central | Avaliar a diferenciação real. |
Autenticação | Genérico | Considerar solução consolidada. |
Emissão fiscal | Genérico ou apoio | Integrar serviço especializado. |
Cobrança | Apoio ou central | Decidir conforme o modelo de negócio. |
Definição e controle de escopo
- Possível classificação
- Central
- Decisão
- Receber maior atenção de modelagem.
Acompanhamento das entregas
- Possível classificação
- Apoio ou central
- Decisão
- Avaliar a diferenciação real.
Autenticação
- Possível classificação
- Genérico
- Decisão
- Considerar solução consolidada.
Emissão fiscal
- Possível classificação
- Genérico ou apoio
- Decisão
- Integrar serviço especializado.
Cobrança
- Possível classificação
- Apoio ou central
- Decisão
- Decidir conforme o modelo de negócio.
Padrões táticos sem coleção de classes
Entidade e objeto de valor
Agregado
Repositório, serviços e fábrica
Eventos, comandos e registros
Exemplo: de uma tabela central a modelos delimitados
Modelando uma plataforma de projetos personalizados
A plataforma possui propostas, escopos, projetos, solicitações de alteração, entregas, aprovações, cobranças, pagamentos, clientes e usuários. No início, uma única tabela projeto acumula dezenas de campos e estados usados por todas as áreas.O trabalho começa com pessoas de vendas, execução e cobrança. A equipe reúne casos reais, exceções e termos ambíguos. Depois separa os contextos Comercial, Execução e Financeiro e define o vocabulário de cada um.No Comercial, uma proposta aceita é o fato relevante. Na Execução, esse fato origina um projeto com um escopo inicial; ajuste interno não é automaticamente alteração contratual. No Financeiro, a cobrança depende de condições acordadas e eventos que tenham significado para aquele contexto.O mapa explicita a passagem de PropostaAceita para a criação do projeto e a informação necessária para faturar. Identificadores conectam os modelos sem exigir uma classe universal. Invariantes são formuladas com exemplos, inclusive esta: uma solicitação de alteração não pode ser aprovada antes do orçamento correspondente.A regra está próxima do conceito que a protege. Isso não prova que classes ricas sejam a melhor representação para todo sistema. O passo seguinte é implementar somente o necessário ao caso atual, testar com exemplos e revisar nomes, regras e limites após o uso real.
Ts
class SolicitacaoDeAlteracao {
aprovar(orcamento: Orcamento) {
if (!orcamento.estaAceito()) {
throw new Error(
"A alteração não pode ser aprovada sem um orçamento aceito.",
)
}
this.status = "aprovada"
}
}
Modelagem é um trabalho colaborativo
Quando DDD pode fazer sentido
Quando provavelmente não compensa
Custos e limitações
DDD não exige microsserviços
O modelo de domínio e o banco de dados
Erros comuns ao adotar DDD
- Começar por tabelas e entidades antes de compreender o problema.
- Copiar uma arquitetura e considerar DDD concluído por causa das pastas.
- Usar todos os padrões táticos ou transformar cada tabela em agregado.
- Criar um repositório genérico para cada entidade.
- Confundir Bounded Context com microsserviço e separar serviços cedo demais.
- Criar eventos para qualquer alteração de campo.
- Produzir abstrações sem exemplos reais.
- Inventar uma linguagem compreendida apenas por desenvolvedores.
- Tratar o modelo como definitivo, consultar somente gestores ou ignorar exceções.
- Modelar regras que não pertencem ao produto.
- Rejeitar CRUD quando CRUD é suficiente.
Vieses também entram no modelo
Como começar sem sobrecarregar o projeto
- Escolha um fluxo importante e problemático.
- Reúna exemplos reais, inclusive exceções.
- Identifique termos ambíguos e formule regras em linguagem compreensível.
- Mapeie quem usa cada conceito e reconheça possíveis limites.
- Implemente o menor modelo capaz de proteger as regras relevantes.
- Crie testes baseados nos exemplos.
- Observe o uso e revise nomes, regras e limites.
- Registre decisões importantes e expanda apenas quando a complexidade justificar.
Perguntas antes de escolher DDD
- Qual complexidade concreta precisamos controlar?
- As regras mudam ou são apenas operações de cadastro?
- Existem conceitos com significados diferentes?
- Quais erros produzem maior impacto?
- Temos acesso às pessoas que conhecem o processo?
- O software representa uma diferenciação importante?
- A equipe consegue manter os padrões escolhidos?
- Um modelo mais simples atenderia?
- Resolvemos um problema atual ou imaginamos complexidade futura?
- O benefício compensa a carga cognitiva?
DDD vale pelo modelo, não pelo número de camadas
Referências
- DDD Reference, de Eric Evans — síntese dos padrões e definições originais, disponibilizada pelo próprio autor.
- Domain Driven Design, de Martin Fowler — visão geral da abordagem e de sua evolução.
- Bounded Context, de Martin Fowler — explicação do limite de validade de um modelo.
- Ubiquitous Language, de Martin Fowler — linguagem compartilhada como prática evolutiva.
- Domain analysis, do Azure Architecture Center — exemplo oficial de análise estratégica, usado com o cuidado de não confundir DDD com microsserviços.
- Tactical DDD, do Azure Architecture Center — definições aplicadas de agregados, serviços e eventos em um contexto específico.
