Upload
others
View
24
Download
0
Embed Size (px)
Citation preview
D D DIntroduçã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ÃO faz parte do domínio
Banco de Dados ou 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é, e até o tester ( sim, ele também tem que
ser capaz de entender só de ler )
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
Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas
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ário Filme
Funcionário
Mídia
Dependente
Cliente
Domain-Driven Design Introdução ao
@CharlesFortes
.com
Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas
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
Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas
Domain-Driven Design Introdução ao
@CharlesFortes
.com
Repositórios sã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
Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas
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
Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas Entidades Objetos de Valor Repositórios Serviços Fabricas
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