O que é Domain-Driven Design (DDD)? Modelando Software para o Negócio

andresn
: ~/blog/
$

No desenvolvimento de software, é muito comum vermos equipes gastando semanas discutindo qual banco de dados usar, qual o melhor framework JavaScript do momento ou como estruturar os endpoints da API. Enquanto isso, as regras de negócio reais do cliente ficam em segundo plano, escondidas atrás de códigos confusos.

O Domain-Driven Design (DDD), ou Design Orientado ao Domínio, nasceu para inverter essa lógica. Criado por Eric Evans em seu livro clássico de 2003, o DDD é uma abordagem de desenvolvimento de software que dita o seguinte: o coração de um sistema não é a tecnologia, é o negócio do cliente.

Vamos entender os conceitos fundamentais do DDD e como ele pode salvar projetos complexos.


O que é o “Domínio”?

Em termos simples, o Domínio é o problema que o seu software se propõe a resolver. É o modelo de negócios da empresa.

  • Se você está criando um software para um hospital, o domínio é a área de saúde (consultas, prontuários, exames).
  • Se está criando um e-commerce, o domínio é o comércio eletrônico (vendas, estoque, logística).

O erro de muitos programadores é tentar modelar o software pensando primeiro nas tabelas do banco de dados (“Abordagem Orientada a Dados”). O DDD nos força a modelar o software pensando em processos, comportamentos e regras de negócio.


Os Pilares do DDD: Estratégico e Tático

Para facilitar o entendimento, o DDD costuma ser dividido em duas grandes caixas de ferramentas: as ferramentas Estratégicas (focadas em design e modelagem de alto nível) e as Táticas (focadas em padrões de código).


1. Design Estratégico (O mais importante!)

Muitos desenvolvedores acham que DDD é apenas criar pastas como “Entities”, “Repositories” e “Services”. Isso é um grande erro. O real poder do DDD está na parte estratégica, que envolve duas ferramentas principais:

Linguagem Ubíqua (Ubiquitous Language)

É um idioma comum falado por todos na equipe: desenvolvedores, designers, gerentes de produto e, principalmente, os especialistas do negócio (Domain Experts). Se o cliente chama o processo de “Faturamento”, o desenvolvedor não deve usar a palavra “Invoice” ou “Billing” no código. O código deve refletir exatamente o vocabulário da empresa. Isso elimina falhas de comunicação.

Contextos Delimitados (Bounded Contexts)

Em sistemas grandes, uma mesma palavra pode ter significados completamente diferentes dependendo de quem está olhando. Por exemplo, em um e-commerce:

  • Para o setor de Vendas, um “Produto” tem preço, descrição e fotos.
  • Para o setor de Logística, o mesmo “Produto” tem peso, dimensões e localização no estoque.

Tentar criar uma única classe Produto gigante com todos esses atributos gera um código insustentável. O DDD resolve isso dividindo o sistema em Contextos Delimitados (Ex: Contexto de Vendas, Contexto de Entrega), onde cada um tem seu próprio modelo de Produto.


2. Design Tático (A Implementação no Código)

Quando descemos para o nível do código, o DDD fornece um conjunto de padrões (Building Blocks) para organizar nossa lógica. Os principais são:

  • Entidades (Entities): Objetos que possuem uma identidade única que não muda ao longo do tempo (ex: um Cliente identificado pelo ID ou CPF).
  • Objetos de Valor (Value Objects): Objetos que não têm identidade própria, eles são definidos apenas pelas suas propriedades. Se o valor mudar, é outro objeto (ex: um Endereço ou um valor de Dinheiro).
  • Agregados (Aggregates): Um grupo de entidades e objetos de valor que são tratados como uma única unidade para gravação e consistência de dados. O ponto de entrada desse grupo é chamado de Aggregate Root (Raiz do Agregado).
  • Serviços de Domínio (Domain Services): Lógicas de negócio que não pertencem naturalmente a uma Entidade ou Objeto de Valor específica.
  • Eventos de Domínio (Domain Events): Algo que aconteceu no negócio e que outras partes do sistema precisam saber (ex: PedidoPagoEvent).

Quando você DEVE (e NÃO deve) usar DDD?

O DDD não é uma bala de prata. Ele traz uma carga de complexidade alta e exige reuniões intensas com os especialistas de negócio.

  • NÃO use DDD se: O seu projeto for um CRUD simples, um site institucional ou um sistema onde a lógica de negócios é muito rasa. Usar DDD aqui vai gerar o famoso overengineering (excesso de engenharia).
  • USE DDD se: O negócio da empresa for complexo, cheio de regras cruzadas, exceções e o software precisa crescer e durar por muitos anos. É a ferramenta perfeita para quando você está planejando migrar um monolito confuso para uma arquitetura de Microsserviços.

Conclusão

O Domain-Driven Design é sobre colocar a tecnologia a serviço do negócio, e não o contrário. Dominar os conceitos conceituais e estratégicos do DDD separa os “digitadores de código” dos verdadeiros engenheiros de software, capazes de traduzir problemas de negócios do mundo real em sistemas elegantes, sustentáveis e de alta qualidade.