O que é Domain-Driven Design (DDD)?
Em português: Design Orientado ao Domínio · Também conhecido como: Domain Driven Design, Design Orientado ao Domínio, DDD
DDD aproxima especialistas de domínio e desenvolvimento para construir modelos de software que expressem regras e fronteiras do negócio.
Domain-Driven Design (DDD) é uma abordagem de design de software que coloca o entendimento do domínio no centro da modelagem. Especialistas e desenvolvedores constroem uma linguagem compartilhada, expressa também no código, e delimitam contextos onde cada modelo mantém significado consistente. É especialmente útil quando regras de negócio complexas mudam e atravessam diferentes partes do sistema.
Origem
Eric Evans reuniu os padrões e o vocabulário de Domain-Driven Design no livro Domain-Driven Design: Tackling Complexity in the Heart of Software, publicado em 2003. Modelar o domínio já era uma preocupação anterior da engenharia de software; sua contribuição foi articular linguagem, colaboração e desenho estratégico e tático como prática contínua.
Evans publicou depois uma referência dos padrões de DDD. Os conceitos se difundiram para arquiteturas e organizações diferentes, sem obrigar o uso de microsserviços. A modelagem deve evoluir com o aprendizado sobre o domínio e com o software em uso.
Fonte primária: Domain-Driven Design: Tackling Complexity in the Heart of Software
Na prática
DDD parte de uma pergunta concreta: que regras e distinções realmente importam para o negócio que o software atende? Num serviço de reservas, “vaga”, “reserva” e “confirmação” podem ter significados diferentes para vendas, operação e cobrança. Se o código tratar tudo como registros genéricos, essas diferenças aparecem como condições espalhadas e difíceis de alterar. A equipe conversa com especialistas, observa exemplos e constrói um modelo que explicita as regras relevantes.
O que acontece quando falta
Em domínios complexos, ausência de linguagem e fronteiras claras pode fazer a mesma palavra significar coisas diferentes no código. Uma regra é repetida em vários pontos, e mudanças deixam de ser localizáveis. Pessoas com conhecimento do negócio gastam tempo traduzindo conceitos para uma estrutura técnica que já não representa sua realidade.
Isso não significa que todo sistema precise adotar DDD formalmente. Um produto simples pode ter conversas e código claros com métodos mais leves. DDD torna-se valioso quando a complexidade do domínio pede investimento explícito em modelo e colaboração contínua.
Como Domain-Driven Design funciona
DDD parte de uma pergunta concreta: que regras e distinções realmente importam para o negócio que o software atende? Num serviço de reservas, “vaga”, “reserva” e “confirmação” podem ter significados diferentes para vendas, operação e cobrança. Se o código tratar tudo como registros genéricos, essas diferenças aparecem como condições espalhadas e difíceis de alterar. A equipe conversa com especialistas, observa exemplos e constrói um modelo que explicita as regras relevantes.
Linguagem ubíqua. Desenvolvedores e especialistas de domínio usam termos comuns nas conversas, exemplos, testes e código. Não é apenas um glossário colado na parede. Se todos dizem “reserva confirmada”, o software deve representar esse estado e suas transições com o mesmo significado. Quando uma palavra é ambígua, a divergência vira pergunta de modelagem. A linguagem muda conforme a equipe aprende; forçar uma definição prematura pode esconder diferenças reais.
Contexto delimitado. Um grande sistema raramente comporta um único modelo coerente para toda a organização. “Cliente” pode significar pagador em cobrança e usuário atendido em suporte. Um bounded context delimita onde um modelo e sua linguagem valem. Entre contextos, traduções e contratos explícitos evitam que uma interpretação invada a outra. A fronteira é conceitual e organizacional; não corresponde automaticamente a um microsserviço, repositório ou banco de dados.
Mapa de contextos. Quando há vários modelos, o time descreve relações entre eles e as dependências de integração. Quem fornece informação? Quem precisa traduzir termos? Onde uma mudança em uma regra terá efeito? O mapa não é um desenho definitivo da arquitetura, mas uma ferramenta de conversa que pode mudar com a organização. Fronteiras mal compreendidas geram sincronizações frágeis e disputas sobre quem decide a definição de um dado.
Modelagem tática. Dentro de um contexto, padrões como entidades, objetos de valor, agregados e eventos de domínio ajudam a expressar regras. Uma entidade preserva identidade ao longo de mudanças. Um objeto de valor é definido por atributos e significado, não por uma identidade própria. Um agregado estabelece uma fronteira para preservar invariantes ao alterar dados relacionados. Um evento de domínio registra algo relevante que aconteceu. Esses padrões são opções para representar o modelo, não peças obrigatórias de todo sistema.
Um agregado mal desenhado pode ficar grande demais e dificultar mudanças simultâneas; pequeno demais, pode deixar uma regra sem proteção. A escolha depende das invariantes reais: o que precisa ser consistente no mesmo momento? Uma reserva não pode ser confirmada duas vezes? Uma vaga precisa ser bloqueada antes da cobrança? Perguntas desse tipo são mais úteis do que começar por diagramas de classes.
Aprendizado contínuo. Uma sessão de modelagem pode revelar termos e regras, mas o trabalho não termina ali. Ao implementar e testar casos reais, a equipe encontra exceções que pedem revisão do modelo. Refatorar o código para refletir o novo entendimento faz parte da abordagem. Congelar um desenho completo antes de construir contraria o valor de aprender com o software. Práticas da XP, como testes e refatoração, podem ajudar a sustentar essa evolução.
Escolha onde investir. Nem toda parte do produto precisa de modelagem sofisticada. Uma função de autenticação comum ou um relatório simples podem usar soluções conhecidas. O maior esforço de DDD costuma valer nos domínios em que regras específicas diferenciam o serviço ou criam maior complexidade. Aplicar entidades e agregados a um cadastro trivial pode acrescentar camadas sem benefício.
DDD não é sinônimo de microsserviços. Um monólito pode conter contextos claros e modelos bem separados. Uma coleção de microsserviços pode ter linguagem confusa e regras duplicadas. Decidir como implantar é outra conversa, dependente de equipes, capacidade operacional e necessidade de independência. Comece pelas fronteiras de significado; depois escolha como implementá-las.
Event Storming é uma técnica de descoberta que pode reunir especialistas e desenvolvedores para explorar acontecimentos e regras do domínio. Não é etapa obrigatória de DDD. Entrevistas, exemplos de casos, análise de fluxos e conversas sobre incidentes também podem fornecer matéria-prima para o modelo.
DDD ajuda a reduzir dívida técnica quando evita que uma regra importante fique dispersa, mas não imuniza o sistema contra complexidade. Uma linguagem que só existe em slides, sem relação com código e decisões, vira cerimônia. A prova está na facilidade de explicar, testar e alterar comportamentos do domínio quando a realidade muda.
Exemplo de DDD em um serviço de reservas
Imagine uma plataforma hipotética de hospedagem com 3 áreas: busca, reservas e cobrança. Todas usam a palavra “reserva”, mas com sentidos distintos. Na busca, uma opção exibida ainda não compromete inventário. Em reservas, uma vaga confirmada precisa estar disponível. Em cobrança, há uma autorização de pagamento que pode ocorrer antes ou depois da confirmação, conforme a regra escolhida. Esses detalhes são inventados para exemplificar fronteiras.
Antes, o sistema usa uma tabela única chamada reserva, com um campo status interpretado por cada área. Uma mudança para permitir pagamento posterior altera condições em 5 serviços e produz relatórios inconsistentes: cobrança chama de confirmada uma opção que reservas ainda considera pendente. O número não descreve caso real.
A equipe conversa com especialistas de cada área e separa os contextos. Define linguagem local: na busca há oferta, em reservas há solicitação e confirmação, em cobrança há autorização e liquidação. Desenha contratos de integração que traduzem os eventos relevantes. Dentro do contexto de reservas, explicita a regra que impede duas confirmações para a mesma vaga.
Depois, uma mudança no prazo de autorização tem um lugar claro para ser discutida e implementada. Ainda haverá integração e casos difíceis, mas a equipe sabe que “confirmado” não deve ser enviado sem contexto. Testes cobrem transições que importam para o negócio, não apenas campos da tabela.
Outro exemplo, fora de um produto de software comercial, seria um serviço público de matrícula. “Vaga” pode significar capacidade planejada numa secretaria e assento efetivamente disponível numa escola. Modelar as duas interpretações sem misturá-las ajuda a explicar por que números que parecem iguais divergem. DDD não resolve a política pública, mas impede que o software esconda uma distinção essencial.
Como começar com DDD
Escolha um problema de domínio relevante
Procure regras que mudam, exceções difíceis ou termos interpretados de modos distintos. Evite aplicar todo o catálogo de padrões a uma área simples só para dizer que usa DDD.
Traga especialistas para a conversa
Inclua quem conhece a operação e decide regras. Explore casos reais e linguagem usada no trabalho, não apenas campos de uma base de dados existente.
Defina termos e exemplos
Registre o significado de conceitos importantes em situações concretas. Quando duas áreas usam a mesma palavra de modos diferentes, não force uma definição única.
Delimite modelos coerentes
Identifique contextos onde as regras formam um conjunto consistente e descreva como informações cruzam fronteiras. Faça um mapa inicial e revise-o conforme aprende.
Modele regras no código
Use entidades, objetos de valor, agregados ou eventos quando ajudam a expressar comportamento. Escreva testes que mostrem invariantes do domínio e evite classes vazias que apenas transportam dados.
Refatore e acompanhe mudanças
Compare o modelo com novas situações encontradas em produção. Ajuste linguagem, testes e fronteiras quando a explicação atual deixar de servir.
Erros comuns com Domain-Driven Design
- Tratar DDD como arquitetura de microsserviços. Contextos são fronteiras de modelo; a implantação física é decisão separada.
- Copiar nomes da base legada. Uma tabela pode refletir decisões antigas e esconder distinções importantes do domínio atual.
- Criar glossário sem usar a linguagem. Termos precisam aparecer nas conversas, nos testes e no código para orientar decisões.
- Aplicar todos os padrões em toda parte. Complexidade acidental pode superar o problema que a abordagem queria resolver.
- Modelar longe dos especialistas. Sem contato com quem vive as regras, o time pode criar uma abstração tecnicamente elegante e conceitualmente errada.
- Congelar o modelo cedo. Aprendizado durante implementação e operação deve poder mudar conceitos e fronteiras.
Para se aprofundar
Fontes primárias
- Domain-Driven Design: Tackling Complexity in the Heart of Software, Eric Evans (2003)
- Domain-Driven Design Reference, Eric Evans (2015)
- Domain Driven Design, Martin Fowler (2020)
Termos relacionados
Perguntas frequentes
DDD exige microsserviços?
Não. Contextos delimitados são fronteiras de significado e consistência do modelo. Eles podem existir em um monólito bem organizado, e microsserviços podem existir sem boas fronteiras de domínio. A decisão de implantação depende de necessidade operacional, equipes e arquitetura. Comece por compreender conceitos e relações antes de escolher a divisão física.
O que é linguagem ubíqua em DDD?
É um vocabulário compartilhado entre especialistas do domínio e pessoas que desenvolvem o software, usado em conversas, exemplos, testes e código. Deve ser preciso dentro do contexto a que pertence e evoluir com o aprendizado. Um glossário isolado não basta se as classes e decisões continuarem usando termos diferentes ou ambíguos.
O que é um bounded context?
É uma fronteira dentro da qual um modelo de domínio e sua linguagem têm significado consistente. A mesma palavra pode ter outra definição fora dela. Mapear a relação entre contextos ajuda a traduzir informação e evitar que regras de uma área invadam outra. A fronteira não corresponde necessariamente a um serviço, banco ou equipe.
Quando vale a pena aplicar DDD?
Quando regras de domínio são complexas, mudam com frequência ou atravessam várias áreas com vocabulário diferente, a colaboração e a modelagem explícita podem compensar o esforço. Em funções simples e padronizadas, uma arquitetura direta pode ser suficiente. O objetivo é reduzir o custo de compreender e alterar comportamentos importantes, não cumprir um catálogo de padrões.
Event Storming é obrigatório para usar DDD?
Não. Event Storming é uma técnica que pode ajudar especialistas e desenvolvedores a explorar acontecimentos, políticas e dúvidas. DDD também pode começar com entrevistas, exemplos de casos, análise de processos e revisão de código. O essencial é aproximar o modelo de software do entendimento do domínio e revisá-lo quando aprender mais.
Curso K21 recomendado
Certified ScrumMaster® (CSM)
Scrum Alliance · 16 horas ao vivo
