DDD - Intro

Definição Formal

"Domain-Driven Design (DDD) é uma abordagem de desenvolvimento de software baseada na premissa de que o código deve ser estruturado em torno do domínio da aplicação e de sua lógica de negócio. Em sistemas complexos, o desenvolvimento deve ser focado no modelo do negócio, promovendo um alinhamento contínuo entre os especialistas do domínio (Domain Experts) e o time de engenharia por meio de um modelo conceitual compartilhado."
Eric Evans (2003)

Em outras palavras

DDD não é um framework, um padrão de pastas ou um tipo de banco de dados. É uma filosofia de trabalho para evitar que programadores construam sistemas que não resolvem a dor real do negócio.

Em vez de começar o projeto decidindo a tabela do banco, você senta com quem entende da empresa e desenha o código com base nas regras do negócio real.


Estratégico vs. Tático


1. Design Estratégico (Visão Macro)

Subdomínios

Definição: Divisão lógica e operacional do problema de negócio em partes menores e mais gerenciáveis, categorizadas segundo o valor estratégico e a vantagem competitiva para a empresa.

Bounded Contexts (Limites de Contexto)

Definição: Delimitação explícita de uma fronteira conceitual na qual um modelo de domínio específico se aplica com significado único, consistente e não ambíguo.

Linguagem Ubíqua

Definição: Linguagem rigorosa e compartilhada, construída colaborativamente por desenvolvedores e Domain Experts, utilizada de forma idêntica nas conversas, documentações e na implementação do código fonte.


2. Design Tático (Visão Micro / Código)

Value Objects (Objetos de Valor)

Definição: Elementos imutáveis do modelo definidos exclusivamente por seus atributos (valores), sem identificação conceitual única.

Entities (Entidades)

Definição: Objetos de domínio que possuem uma identidade única e contínua ao longo de seu ciclo de vida, cujos atributos podem alterar de estado sem alterar a identidade do elemento.

Aggregates (Agregados)

Definição: Grafo de Entidades e Objetos de Valor tratados como uma unidade coesa para modificação de dados, delimitados por uma raiz (Aggregate Root) responsável por garantir a consistência transactional e as invariants de negócio.

Repositories (Repositórios)

Definição: Abstração da camada de persistência que simula uma coleção em memória de Agregados, isolando o modelo de domínio de detalhes técnicos de banco de dados ou frameworks.

Domain Events (Eventos de Domínio)

Definição: Notificação explícita de um evento de negócio relevante que ocorreu no passado dentro de um contexto delimitado, permitindo desacoplamento entre módulos.


DDD vs. Arquitetura Hexagonal: O quão similares?

Não são a mesma coisa. São abordagens complementares com propósitos distintos.


Takeaway

Nem todo projeto precisa de DDD. Se o sistema é um CRUD simples (como o sistema da padaria da esquina), aplicar DDD gera complexidade desnecessária. DDD é a ferramenta ideal para sistemas complexos, onde a regra de negócio é densa e muda constantemente.