“Domain-driven design is not a technology nor methodology.” ~ Eric Evans
Domain-Driven Design: Atacando as complexidades no coração do software - Eric Evans | Implementando Domain-Driven Design - Vaughn Vernon |
---|---|
O design orientado ao domínio, também conhecido como DDD (Domain Driven Design) é uma abordagem que trabalha com práticas de design e desenvolvimento, oferecendo ferramentas de modelagem tática e estratégica para entregar um software de alta qualidade, acelerando o seu desenvolvimento e garantindo sua sustentabilidade.
Uma Entidade é um objeto com suas próprias propriedades (estado, dados) e métodos que implementam a lógica de negócios que é executada nessas propriedades. Uma entidade é representada por seu identificador único (Id). Exemplo de entidades: Usuário, Cliente, Organização..etc
É outro tipo de objeto de domínio que é identificado por suas propriedades em vez de um ID exclusivo. Exemplo de objetos de valor: Nome, Endereço, JobTitle..etc. Uma implementação correta de uma entidade de usuário e um objeto de valor de nome seria que a identificação exclusiva do usuário fosse feita por um UUID e não pela string de nome
Um Agregado é um cluster de objetos (entidades e objetos de valor) unidos por um objeto Raiz Agregado. A Raiz Agregada é um tipo específico de entidade com algumas responsabilidades adicionais para manter a consistência das alterações em objetos em um modelo com associações complexas.
Quando temos um comportamento não atrelado a uma Entity ou Value Object, podemos representá-lo como um Domain Service.
Domain Service tem as seguintes características:
- Não mantêm estado
- Não tem rastreabilidade
- Podem receber Entities e Value Objects como parâmetro
- Podem ter dependências de interfaces para serviços externos
- Executam alguma regra de negócio.
Um Repositório é uma interface semelhante a uma coleção que é usada pelas Camadas de Domínio e de Aplicação para acessar o sistema de persistência de dados.
Todo tipo de Agregado persistente terá um Repositório. De um modo geral, existe uma relação de um-para-um entre um tipo de Agregado e um Repositório.
“Implementing Domain-Driven Design - Vaughn Vernon”
Eventos de domínio são abstrações poderosas para facilitar a comunicação entre contextos delimitados e, eventualmente, como alternativa para persistência.
Use um evento de domínio para capturar uma ocorrência de algo que aconteceu no domínio.
“Implementing Domain-Driven Design - Vaughn Vernon”
Um Módulo serve como um contêiner para um conjunto específico de classes de sua aplicação. Em PHP, este seria um namespace específico que contém todas as classes relacionadas a esse conceito específico.
O código dentro de um módulo deve ser altamente coeso e deve haver baixo acoplamento entre classes de módulos diferentes.
Uma Factory é um objeto que tem a responsabilidade única de criar outros objetos.
Fonte: https://faun.pub/demystifying-domain-driven-design-b7987c9ed09a