D D D
Introdução ao
@CharlesFortes
.com
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O que é
Domain-DrivenDesign?
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
É Desenvolver Focado no
Domínio
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
É Desenvolver Focado no
Domínio
WTF?
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Domínio Segundo o Dicionário:
• Esfera de Ação; Competência;
Conhecimento.
• O conteúdo de uma área de
conhecimento.
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Domínio é a área de conhecimento do negócio.
Tudo do Software ligado ao negócio
faz parte do domínio
Locadora
Locadora
Locadora
Locadora
Locadora
Locadora
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Meu Negócio:
Locar Filmes
Fornecedor
Mídias
Filmes
Usuários
Funcionários
Dependentes
Cliente
Locação
de Filme
Reserva
de Filme
...
Cadastros de
Clientes e
Dependentes
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
NÃOfaz parte do domínio
Banco de Dadosou Frameworks para os mesmos como o
Nhibernate
Threads
Tratamentos de Excessão
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Principais Vantagens
As tecnologias mudam muito mais rápido do que o negócio
Camadas bem definidas
Responsabilidades claras e bem divididas
Manutenabilidade, Longevidade, Escalabilidade, etc...
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Principais Desvantagens
Mais tempo para desenvolver (porém poupa tempo
futuro durante a manutenção e a extensão)
Complexidade! Não é a solução para todos os problemas...
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
Para o entendimento do domínio deve-se gerar um
MODELO do domínio
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
MODELO
WTF? ?
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
Os modelos são abstrações que visam refletir o código
Evans cita em seu livro que o modelo não pode ser "gordo" demais ao ponto de
prejudicar a compreensão do domínio.
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
E o código, por sua vez, deve ser usado para detalhar o modelo.
Regras importantes devem estar expostas no modelo, e jamais escondidas no
código.
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
O modelo deve ser muito claro!
Deve ser entendido absolutamente da mesma forma por qualquer
pessoa, seja ele
o usuário, o desenvolvedor, o arquiteto, o projetista, o
designer
a menina do marketing, a tia do café, etc
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
Para que o modelo seja entendido é necessário uma
linguagem ubíqua!
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
Para que o modelo seja entendido é necessário uma
linguagem ubíqua!
WTF?
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
Uma linguagem ubíqua é uma linguagem única falada por todos os
envolvidos no projeto, de forma que a todo momento possa-se conversar sobre o projeto
sem ter de ficar traduzindo o que está sendo falado
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
Tudo isso para evitar maus
entendidos
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
O Modelo e a Linguagem Ubíqua
O modelo pode ser qualquer coisa, contanto que consiga expressar de forma clara o
domínio
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Todo o domínio
(implementação) giram em torno
do modelo
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Lets Model
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
os Serviços Fabricas Entidades Objetos de Valor Repositórios ServiçosFabricas Entidades Objet
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Entidades são objetos que têm significado no domínio, possuindo uma
identidade única
Entidades
UsuárioFilme
Funcionário
Mídia
Dependente
Cliente
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
os Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Objetos de Valor não tem valor direto ao negócio, e por isto
não possuem uma identidade.
Cliente
Nome
CPF
Telefone
Endereco
Usados como estrutura de
dados apenas para armazenar
valores.
Muito usados para
transporte de dados ou
composição de
objetos.
Logradouro
Numero
Bairro
etc
etc
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
os Serviços Fabricas Entidades Objetos de Valor Repositórios ServiçosFabricas Entidades Objet
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Repositóriossão responsáveis por persistir, recuperar e destruir
objetos
Fingem possuir todas as entidades na memória, para
quem utiliza não importa onde estão os
dados
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Armários de Caixas
Fingem possuir todas as entidades na memória, para
quem utiliza não importa onde estão os
dados
(Sim, foi feito no paint...)
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
os Serviços Fabricas Entidades Objetos de Valor Repositórios ServiçosFabricas Entidades Objet
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Serviços na visão do DDD consiste em um objeto que visa resolver
problemas do domínio
Para isto o “service” utiliza
Entidades, Objetos de
Valor, Repositórios,
infraestrutura, etc..
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Meu Negócio:
Locar Filmes
Locar
Filme
Reservar
Filme
Cadastrar
Cliente
Pesquisar
Filme
Etc...
Serviços na visão do DDD consiste em um objeto que visa resolver
problemas do domínio
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
os Serviços Fabricas Entidades Objetos de Valor Repositórios ServiçosFabricas Entid
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Muitas vezes criar um novo objeto para atender a um aspecto do
domínio envolve a instanciação de diversas entidades, agregações e
composições.
Quando isto se faz necessário não o fazemos dentro do
construtor da classe, passamos esta responsabilidade para
uma fábrica.
Outras vezes pode ser necessário decidir entre valores de
inicialização padrão ou mesmo da especialização da classe.
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Neste caso a especialização na construção é prática pois:
• As entidades são mapeadas em diferentes tabelas do banco de dados
• As entidades possuem diferentes validadores
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Lets Code
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0
0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0
Domain-Driven Design
Introdução ao
@CharlesFortes
.com
Concluindo...
Defina uma linguagem única, expresse o negócio do cliente de forma clara e
certifique-se que TODOS falam a mesma língua.
Implemente de forma que o código traduza de forma analítica o que está foi
modelado, para que daqui a 20 anos, quando o estagiário for mexer no fonte,
ele saiba do que se trata, e se não souber, pode consultar ao productOwner
sem problemas.
E lembre-se do princípio de fazer simples, refatorar e melhorar sempre.
Domain-Driven Design
Introdução ao
@CharlesFortes
pangeanet.org/profile/charlesfortes
br.linkedin.com/in/charlesfortes

Introdução ao DDD