SlideShare uma empresa Scribd logo
1 de 88
Domain-Driven Design
Leandro A. Vieira
Maicon C. Pereira
Domain-Driven Design
2003
Evans
2013
Vernon
2015
Millet
Complexidade no Software
Essencial
Complexidade da
Lógica do
Negócio/Domínio
Acidental
Complexidade da
Solução Técnica +
Código Legado
Big Ball Of Mud – Grande Bola de Lama
• A arquitetura não é bem definida
• Correções e pequenas evoluções
tornam-se um grande desafio devido a
dificuldade de entender o código
• Evans: “BBoM é aquele código faz
alguma coisa útil, mas sem explicar
como”
“DDD é sobre a redução de complexidade
no software”
Eric Evans
DDD é sobre o negócio
Domínio do Negócio (Domain)
• Uma esfera de conhecimento
• O que ela faz e como ela faz...
• Cada empresa
• tem o know-how do segmento/problema que ela atende
• E o seu jeito de fazer
• Conhecer o domínio é a parte mais importante do DDD
Exemplo de Domínio
• Se você estiver criando um software para gerenciar avaliações de
desempenho dos funcionários, você precisará compreender
• como as avaliações realmente funcionam,
• todo o fluxo de trabalho,
• as necessidades e expectativas dos clientes,
• como isso afeta a folha de pagamento, etc.,
DDD é sobre criar modelos altamente
expressivos
O que é um Modelo?
• Simplificação da realidade
• Mostra alguns aspectos da realidade
ou uma ideia de interesse
Como você representa seu modelo?
Como você representa seu modelo?
User Stories (Text) ?
Como você representa seu modelo?
Como você representa seu modelo?
Modelo é uma representação mental
Todo o resto são apenas
ferramentas de
comunicação
Como construir um modelo no DDD ?
Logo...
• Domain expert acessível;
• Alta interação entre o domain expert e o time de desenvolvimento;
Manifesto Ágil
• Indivíduos e interações mais que processos e ferramentas
• Colaboração com o cliente mais que negociação de contratos
• Princípio: Pessoas relacionadas à negócios e desenvolvedores devem
trabalhar em conjunto e diariamente, durante todo o curso do
projeto.
http://www.manifestoagil.com.br
Linguagem Ubíqua
Baseado em uma linguagem
comum
Expresso em todos os níveis
#SQN
Tática sem estratégia é o ruído antes da derrota.
Sun Tzu
Arte da Guerra
• Antes de colocar a mão na massa e falar sobre
codificação, você deve entender o Problema
• O DDD enfatiza
• Suas terminologias (LU)
• A razão pela qual está sendo desenvolvido
• Quais são os fatores de sucesso para o negócio
• A necessidade de a equipe de desenvolvimento
valorizar o conhecimento do domínio, tanto quanto
a experiência técnica
Projeto
Estratégico
do DDD
Problema
Domínio
VendoLivros S/A
Loja de Livros A VendoLivros S/A é uma empresa
que comercializa apenas livros, seu
grande diferencial está na entrega,
que é bem mais rápida que seus
concorrentes devido a sua grande
expertise em logística e
distribuição.
Decompondo o problema
Lei de Conway
Presidência
Vendas
..
Marketing
..
Pagamentos Estoque Entrega ...
Resumo: A forma como as organizações estão estruturadas
tem um forte impacto sobre os sistemas que elas criam
"Qualquer empresa que projeta um sistema (definição mais ampla
aqui do que apenas sistemas de informação), inevitavelmente produz
um projeto cuja estrutura é uma cópia da estrutura de comunicação
da organização.“ Melvin Conway (1968)
Decompondo o problema Subdomínio
Estoque
RH, Financeiro
Tesouraria
...
Vendas
Marketing
Entrega
Domínio
VendoLivros
Catálogo
Pedidos
Preços
Localização
Armazenamento
Taxa de entrega
Prazo de entrega
Parceiros de transporte
Propaganda
Promoções
Pagamentos
Boleto
Cartão de Crédito
Presidên
cia
ndas
..
Marketi
ng
..
Pagame
ntos
Estoque Entrega ...
Decompondo o problema Subdomínio
Estoque
RH, Financeiro
Tesouraria
...
Vendas
Marketing
Entrega
Pagamentos
Domínio Principal (Core Domain)
• Sucesso para o negócio
• Focar todos os esforços
Decompondo o problema Subdomínio
Estoque
RH, Financeiro
Tesouraria
...
Vendas
Marketing
Entrega
Pagamentos
Domínio Principal (Core Domain)
• Sucesso para o negócio
• Focar todos os esforços
Subdomínio de Suporte
• Essenciais mas não o core
• Desenvolver ou comprar
Decompondo o problema Subdomínio
Estoque
RH, Financeiro
Tesouraria
...
Vendas
Marketing
Entrega
Pagamentos
Domínio Principal (Core Domain)
• Sucesso para o negócio
• Focar todos os esforços
Subdomínio de Suporte
• Essenciais mas não o core
• Desenvolver ou comprar
Subdomínio Genérico
• Não agrega valor para o negócio
• Se possível, Comprar / Github
Foco no Domínio Principal
Foco no Domínio Principal
Não perca tempo e esforço para refatorar todo o seu código, foque no
domínio principal!
Para subdomínios de suporte e genéricos, o código bom é o suficiente.
A perfeição é uma ilusão, e deve ser reservada apenas para o que é
essencial
O negócio não se preocupa com a qualidade do código
para as áreas que não são essenciais
Scott Millett
Decompondo o problema Modelo de Domínio (Domain Model)
Estoque
RH, Financeiro
Tesouraria
...
Vendas
Marketing
Entrega
Pagamentos
Representa a lógica de domínio e as
regras de negócios que são relevantes
para o subdomínio
Modelo de
Domínio
Modelo de
Domínio
Modelo de
Domínio
Modelo de
Domínio
Modelo de
Domínio
Modelo de
Domínio
Livro
Subdomínio
Estoque
Subdomínio
Marketing
Subdomínio
Vendas
Subdomínio
Entrega
Lógica Aplicação
Lógica Domínio
Acesso à dados
Livro
Banco de
Dados
Estoque
Vendas
Marketing Entrega
Contextos Delimitados (Bounded Context)
• Definem a maneira como um subdomínio será resolvido
tecnicamente pela solução
• Enquanto o conceito do Subdomínio pertence ao que chamamos de
Espaço Problema, os Contextos Delimitados pertencem ao Espaço
Solução
Estoque
RH, Financeiro
Tesouraria
...
Vendas
Marketing
Entrega
Pagamentos
Contextos Delimitados (Bounded Context)
Contexto de
Catálogo
Contexto de
Precificação
Contexto de
Pedidos
Subdomínio de Vendas
Contexto de
Promoções
Contexto de
Publicidade
Subdomínio de
Marketing Contexto de
Estoque
Subdomínio de
Estoque
Contexto de
Pagamento
Subdomínio de
Pagamento
Contexto de
Entrega
Subdomínio de
Entrega
Contexto de
ERP Legado
Subdomínio de
ERP Legado
Contextos Delimitados (Bounded Context)
Contexto de
Catálogo
Contexto de
Precificação
Contexto de
Pedidos
Subdomínio de Vendas
Contexto de
Promoções
Contexto de
Publicidade
Subdomínio de
Marketing Contexto de
Estoque
Subdomínio de
Estoque
Contexto de
Pagamento
Subdomínio de
Pagamento
Contexto de
Entrega
Subdomínio de
Entrega
Contexto de
ERP Legado
Subdomínio de
ERP Legado
Sistema VendoLivros Online
Estoque
RH, Financeiro
Tesouraria
...
Vendas
Marketing
Entrega
Pagamentos
Modelo de
Domínio
Modelo de
Domínio
Modelo de
Domínio
Modelo de
Domínio
Modelo de
Domínio
Modelo de
Domínio
Livro
Contextos Delimitados (Bounded Context)
Contexto de
Catálogo
Contexto de
Precificação
Contexto de
Pedidos
Subdomínio de Vendas
Contexto de
Promoções
Contexto de
Publicidade
Subdomínio de
Marketing Contexto de
Estoque
Subdomínio de
Estoque
Contexto de
Pagamento
Subdomínio de
Pagamento
Contexto de
Entrega
Subdomínio de
Entrega
Contexto de
ERP Legado
Subdomínio de
ERP Legado
• Tornar o Implícito Explicito
• Define explicitamente o
contexto dentro do qual
um modelo se aplica.
• É delimitado pela
linguagem compartilhada
• Protege seu modelo
Livro
Livro
Livro
Livro
Livro
Livro
Livro
Alinhe seus times à Contextos Delimitados
Mapa de Contexto (Context Mapping)
Mapa de Contexto
• Estabelece uma visão da comunicação entre as equipes
• Torna as delimitações dos contextos explícitos
• Fornece a visão para possíveis alterações e evoluções
• Estabelece um conjunto de padrões de comunicações
• Núcleo compartilhado
• Cliente Fornecedor
• Conformista
• Parceria
• Camada de Anticorrupção
• Linguagem Publicada
Todas as relações tem suas motivações e seu preço...
Núcleo Compartilhado (Shared Kernel)
• Dois times compartilham um subconjunto de modelo de um mesmo subdomínio
• Alterações dentro do núcleo compartilhado devem ser acordadas entre as duas
equipes
• Integração Contínua
• Geralmente é o Domínio Principal
Contexto de
Folha de Pagamento
Contexto de
Recursos Humanos
Modelo de Domínio
Do Funcionário
Subdomínio
Recurso Humanos
Baseado em direções
• O Downstream é o lado do relacionamento que depende de dados ou
comportamentos do lado Upstream
Contexto
Downstream
Contexto
Upstream
Cliente/Fornecedor (Customer/Supplier)
• É uma relação de cliente e fornecedor
• Orçar/Estimar
• Planejamento da entrega
• Direito a veto, negociar com o Fornecedor
• Interação – O team Cliente deve estar disponível para sanar dúvidas
Contexto Vendas Contexto
Pedidos
Customer-Supplier
Downstream Upstream
Consome/utiliza de
Cliente/Fornecedor (Customer/Supplier)
• Testes automatizados
• Escritos pela equipe de cliente (definindo a interface esperada)
• Executados pela equipe Fornecedor (Para garantir que não estão quebrando
nada)
Contexto Vendas Contexto
Pedidos
Customer-Supplier
Downstream Upstream
Consome/utiliza de
Cliente/Fornecedor (Customer/Supplier)
• Equipes de Clientes/Fornecedores tem maior chance de sucesso se
elas trabalham sob a mesma gerência e compartilham os mesmos
objetivos
Contexto Vendas Contexto
Pedidos
Customer-Supplier
Downstream Upstream
Consome/utiliza de
Conformista (Conformist)
• Não há colaboração entre o contexto downstream e o upstream
• Muito comum em relacionamento com contextos que representam
um sistema de terceiro, API...
A A
Contexto Vendas Contexto
Pagamentos
Conformista
Downstream Upstream
Consome/utiliza de
Conformista (Conformist)
• Se o Upstream é uma bagunça, essa bagunça será propagada para o
Downstream
• É caro criar uma camada de tradução para que os objetos do
upstream não corrompem o modelo do downstream
A A
Contexto Vendas Contexto
Pagamentos
Conformista
Downstream Upstream
Consome/utiliza de
Camada de Anticorrupção (Anti-Corruption Layer)
• Criar uma camada para tradução entre os termos do Upstream para o
modelo do Downstream, e vice-e-versa.
• Protege o modelo de domínio de influências externas
Contexto Vendas Contexto
Pagamentos
ACL
Anti-Corruption
Layer
Downstream Upstream
Camada de Anticorrupção (Anti-Corruption Layer)
Parceria (Partnership)
• Dependência mútua entre os contextos/equipes, elas obtém o sucesso ou
fracasso juntas;
• Possuem um objetivo em comum
• Cooperam na evolução das interfaces para acomodar as necessidades de ambos
• Entregas/Releases são alinhadas
Contexto Vendas Contexto Pedidos
Partnership
Caminhos separados (Separate Ways)
• Quando realmente não há relacionamento entre os contextos
• Quando o custo de tradução é tão grande que é preferível a duplicação de parte
do modelo e que eles sigam em Caminhos separados.
Contexto Publicidade Contexto Entrega
Linguagem Publicada (Published Language)
• Quando você quer abrir seu contexto para integração com vários clientes
• Se muitos contextos compartilham a mesma lógica de tradução, pode ser
preferível que se tenha uma forma de acesso com interfaces claramente
definidos
• Define o protocolo de comunicação
Serviço Aberto de Funcionalidades
(Open/Host Service)
• Quando você quer definir uma linguagem comum para comunicação
Comunicação através de API REST, JSON/XML
Contexto Pedido
Contexto Estoque
Contexto Entrega
Contexto Catálogo
OHS
A estratégia sem tática é o caminho mais lento para a vitória.
Sun Tzu
Arte da Guerra
Projeto Tático
Arquitetura
Model-Driven Design
Entidade (Entity)
Tem uma identidade
A igualdade é dada pelo seu ID (identidade)
ad hoc setters
Objeto de Valor (Value Object)
Imutável
Não tem uma identidade
A sua igualdade é dada pelas
suas propriedades
Tem Regra de negócio
Objeto de Valor (Value Object)
• Reduz o code smell “Obsessão com tipos Primitivos”
Agregado Raiz
Entidade
Objeto Valor
Agregados (Aggregate)
• Compostos de Entidades
ou Objetos de Valores
que são encapsulados
numa única classe;
• Serve para manter a
integridade do modelo;
• Possui uma raiz de
agregação (Aggregate Root);
• Único repositório por
raiz de agregação;
Serviço de Domínio (Domain Service)
• Classes que contém uma lógica de negócio mas que não pertencem a
nenhuma entidade ou objeto de valor;
• Serviços não guardam estado (Stateless);
• Toda chamada a um mesmo serviço, com a mesma pré-condição deve retornar o mesmo
resultado.
• Orquestrar entidades e encapsular regras de negócios;
• Conceito de domínio que vem da LU e que envolve várias entidades;
• Protege o modelo (entidade / objeto de valor)
Evento de Domínio (Domain Event)
• Notifica aos interessados que algo importante aconteceu no domínio;
• Exemplo de eventos:
• Livro entregue
• Livro foi separado
• Livro foi enviado
• Pedido gerado
• OCP – Aberto para extensão e fechado para alteração
Critérios Técnicos
Por Conceitos da LU
Módulo (Module)
• Divide o código por conceito (LU) e não por
critério técnico;
• São usados para decompor o modelo de domínio;
• Permitem ao desenvolvedor ler e entender
rapidamente o modelo do domínio;
• Namespace / Projects
Fábrica (Factory)
• Utilize construtores apenas para criação de objetos simples,
• Para objetos complexos utilize fábricas
• Encapsula toda a lógica necessária para criar um Agregado em um
estado consistente
• Centraliza a lógica de criação
• Utilize os padrões GoF:
• Factory Method
• Abstract Factory
• Builder
Repositório (Repository)
• É o mecanismo que você deve usar para recuperar e persistir
agregados
• Persistência Agnóstica, é uma preocupação de infraestrutura, não do
modelo
• Pode ser útil se apoiar em estruturas de ORM (Entity Framework,
NHibernate)
• Um por Raiz de Agregação
• Não é indicado para Relatórios e telas de consultas complexas
Especificação (Specification)
• Torna a regra de negócio implícita explicita
• Utilizado principalmente para validações
• Permite a criação de especificações compostas (utilizando E, OU, Não)
Quando NÃO utilizar DDD
Quando...
• o domínio não é complexo, pode ser resolvido com um simples CRUD
• a solução é muito mais técnica do que de negócio, Ex: Um framework
• o Domain Expert não é acessível
• você não tem um time motivado e qualificado
• o processo de desenvolvimento é cascata
Adotar DDD só porque é legal
Ignorar o DDD porque o domínio parece ser pouco complexo
E se você não seguir o DDD em aplicações
complexas...?
• Provavelmente você terá um modelo anêmico com muitos serviços
• Regras de negócios ficam espalhadas em classes que não são do
domínio
• Difícil de mudar o sistema em uma alteração/evolução da regra de
negócio
• Comunicação negligenciada
Pra saber mais...
2003
Evans
2006
Avram & Marinescu
2013
Vernon
2016
Vernon
2014
Evans
2009
Haywood
2006
Nilsson
2015
Millet
2008
McCarthy
2017
Buenosvinos
2011
La Torre
https://elearn.domainlanguage.com/
http://www.informit.com/store/domain-driven-design-
livelessons-video-training-9780134597324?ranMID=24808
https://www.sympla.com.br/acampamento-de-base-ddd-enriquecendo-a-evolucao-de-suas-aplicacoes__144198
https://www.sympla.com.br/microservice-architecture-design-e-implementacao-net__181411
http://www.eduardopires.net.br/curso-de-arquitetura-de-software-dotnet/
Conteúdo do Curso
• Introdução
• Linguagem Obíquoa
• Domínios Ricos vs Domínios
Anêmicos
• Sub Domínios
• Separação em Contextos
Delimitados
• Organizando a Solução
• Definindo as Entidades
• Corrupção no Código
• SOLID e Clean Code
• Primitive Obsession
• Value Objects
• Compartilhando Informações
entre Contextos Delimitados
• Testando as Entidades e VOs
• Commands
• Fail Fast Validations
• Testando os Commands
• Repository Pattern
• Handlers
• Testando os Handlers
• Queries
• Testando suas Queries
http://live.balta.io/
Dúvidas?
Obrigado!

Mais conteúdo relacionado

Mais procurados

Project management elementi base
Project management elementi baseProject management elementi base
Project management elementi baseClarissa Retrosi
 
présentation soutenance PFE
présentation soutenance PFEprésentation soutenance PFE
présentation soutenance PFEHeithem Moumni
 
Project Management Toolkit - Presentation
Project Management Toolkit - PresentationProject Management Toolkit - Presentation
Project Management Toolkit - PresentationHassan Rizwan
 
Notes de cours et tp - Administation Systèmes
Notes de cours et tp  - Administation Systèmes Notes de cours et tp  - Administation Systèmes
Notes de cours et tp - Administation Systèmes Ikram Benabdelouahab
 
Project Management Fundamentals | Project Management Simplified | PMP® Traini...
Project Management Fundamentals | Project Management Simplified | PMP® Traini...Project Management Fundamentals | Project Management Simplified | PMP® Traini...
Project Management Fundamentals | Project Management Simplified | PMP® Traini...Edureka!
 
Chap 9.0 Project Resource Management overview
Chap 9.0   Project Resource Management overviewChap 9.0   Project Resource Management overview
Chap 9.0 Project Resource Management overviewAnand Bobade
 
Chap 5.3 define scope
Chap 5.3 define scopeChap 5.3 define scope
Chap 5.3 define scopeAnand Bobade
 
Software Engineering - chp3- design
Software Engineering - chp3- designSoftware Engineering - chp3- design
Software Engineering - chp3- designLilia Sfaxi
 
Pm first presentation
Pm first presentationPm first presentation
Pm first presentationcarlobisio
 
Project Management Professional PMI-PMP Based on PMBOK 6th Edition
Project Management Professional PMI-PMP Based on PMBOK 6th EditionProject Management Professional PMI-PMP Based on PMBOK 6th Edition
Project Management Professional PMI-PMP Based on PMBOK 6th EditionJohn Khateeb
 
Software requirements engineering lecture 01
Software requirements engineering   lecture 01Software requirements engineering   lecture 01
Software requirements engineering lecture 01Abdul Basit
 
Instructor Slides - PMP/CAPM PMBOK 6th Edition
Instructor Slides - PMP/CAPM PMBOK 6th EditionInstructor Slides - PMP/CAPM PMBOK 6th Edition
Instructor Slides - PMP/CAPM PMBOK 6th EditionMnbianchi
 
Cours Unix Emsi 2023 2024.pdf
Cours Unix Emsi 2023 2024.pdfCours Unix Emsi 2023 2024.pdf
Cours Unix Emsi 2023 2024.pdfADNANEELBOUAAMRI
 
PMBOK® Guide Sixth Edition | Project Management Certification | PMP® Certific...
PMBOK® Guide Sixth Edition | Project Management Certification | PMP® Certific...PMBOK® Guide Sixth Edition | Project Management Certification | PMP® Certific...
PMBOK® Guide Sixth Edition | Project Management Certification | PMP® Certific...Edureka!
 
Methods for Validating and Testing Software Requirements (lecture slides)
Methods for Validating and Testing Software Requirements (lecture slides)Methods for Validating and Testing Software Requirements (lecture slides)
Methods for Validating and Testing Software Requirements (lecture slides)Dagmar Monett
 
Gestion du Cycle de Vente d'Affaire ou de Solutions
Gestion du Cycle de Vente d'Affaire ou de SolutionsGestion du Cycle de Vente d'Affaire ou de Solutions
Gestion du Cycle de Vente d'Affaire ou de SolutionsGerard Konan
 
CMMi level 3 presentation
CMMi level 3 presentationCMMi level 3 presentation
CMMi level 3 presentationadinmani
 

Mais procurados (20)

CBAP® Preparation Course
CBAP® Preparation CourseCBAP® Preparation Course
CBAP® Preparation Course
 
Project management elementi base
Project management elementi baseProject management elementi base
Project management elementi base
 
Spm unit 1
Spm unit 1Spm unit 1
Spm unit 1
 
Chap04 project integration management
Chap04 project integration managementChap04 project integration management
Chap04 project integration management
 
présentation soutenance PFE
présentation soutenance PFEprésentation soutenance PFE
présentation soutenance PFE
 
Project Management Toolkit - Presentation
Project Management Toolkit - PresentationProject Management Toolkit - Presentation
Project Management Toolkit - Presentation
 
Notes de cours et tp - Administation Systèmes
Notes de cours et tp  - Administation Systèmes Notes de cours et tp  - Administation Systèmes
Notes de cours et tp - Administation Systèmes
 
Project Management Fundamentals | Project Management Simplified | PMP® Traini...
Project Management Fundamentals | Project Management Simplified | PMP® Traini...Project Management Fundamentals | Project Management Simplified | PMP® Traini...
Project Management Fundamentals | Project Management Simplified | PMP® Traini...
 
Chap 9.0 Project Resource Management overview
Chap 9.0   Project Resource Management overviewChap 9.0   Project Resource Management overview
Chap 9.0 Project Resource Management overview
 
Chap 5.3 define scope
Chap 5.3 define scopeChap 5.3 define scope
Chap 5.3 define scope
 
Software Engineering - chp3- design
Software Engineering - chp3- designSoftware Engineering - chp3- design
Software Engineering - chp3- design
 
Pm first presentation
Pm first presentationPm first presentation
Pm first presentation
 
Project Management Professional PMI-PMP Based on PMBOK 6th Edition
Project Management Professional PMI-PMP Based on PMBOK 6th EditionProject Management Professional PMI-PMP Based on PMBOK 6th Edition
Project Management Professional PMI-PMP Based on PMBOK 6th Edition
 
Software requirements engineering lecture 01
Software requirements engineering   lecture 01Software requirements engineering   lecture 01
Software requirements engineering lecture 01
 
Instructor Slides - PMP/CAPM PMBOK 6th Edition
Instructor Slides - PMP/CAPM PMBOK 6th EditionInstructor Slides - PMP/CAPM PMBOK 6th Edition
Instructor Slides - PMP/CAPM PMBOK 6th Edition
 
Cours Unix Emsi 2023 2024.pdf
Cours Unix Emsi 2023 2024.pdfCours Unix Emsi 2023 2024.pdf
Cours Unix Emsi 2023 2024.pdf
 
PMBOK® Guide Sixth Edition | Project Management Certification | PMP® Certific...
PMBOK® Guide Sixth Edition | Project Management Certification | PMP® Certific...PMBOK® Guide Sixth Edition | Project Management Certification | PMP® Certific...
PMBOK® Guide Sixth Edition | Project Management Certification | PMP® Certific...
 
Methods for Validating and Testing Software Requirements (lecture slides)
Methods for Validating and Testing Software Requirements (lecture slides)Methods for Validating and Testing Software Requirements (lecture slides)
Methods for Validating and Testing Software Requirements (lecture slides)
 
Gestion du Cycle de Vente d'Affaire ou de Solutions
Gestion du Cycle de Vente d'Affaire ou de SolutionsGestion du Cycle de Vente d'Affaire ou de Solutions
Gestion du Cycle de Vente d'Affaire ou de Solutions
 
CMMi level 3 presentation
CMMi level 3 presentationCMMi level 3 presentation
CMMi level 3 presentation
 

Semelhante a Introdução a Domain-Driven Design

Uma introdução ao Domain Driven Design
Uma introdução ao Domain Driven DesignUma introdução ao Domain Driven Design
Uma introdução ao Domain Driven DesignLambda3
 
TDC - Qual o tamanho adequado de um micro serviço?
TDC - Qual o tamanho adequado de um micro serviço?TDC - Qual o tamanho adequado de um micro serviço?
TDC - Qual o tamanho adequado de um micro serviço?Rafael Salerno de Oliveira
 
Domain Driven Design com Python
Domain Driven Design com PythonDomain Driven Design com Python
Domain Driven Design com PythonFrederico Cabral
 
Programando com prazer com DDD
Programando com prazer com DDDProgramando com prazer com DDD
Programando com prazer com DDDGiovanni Bassi
 
DDD e Microsservicos - do negócio à arquitetura
DDD e Microsservicos - do negócio à arquiteturaDDD e Microsservicos - do negócio à arquitetura
DDD e Microsservicos - do negócio à arquiteturaGraziella Bonizi
 
Portfólio dos principais Serviços e Produtos | Bug BusterS
Portfólio dos principais Serviços e Produtos | Bug BusterSPortfólio dos principais Serviços e Produtos | Bug BusterS
Portfólio dos principais Serviços e Produtos | Bug BusterSWellington Watanabe Filho
 
Domain-Driven-Design
Domain-Driven-DesignDomain-Driven-Design
Domain-Driven-DesignWende Mendes
 
Domain-Driven-Design
 Domain-Driven-Design Domain-Driven-Design
Domain-Driven-DesignWende Mendes
 
Indo além do técnico para desenvolver sistemas que evoluem na velocidade do...
Indo além do técnico para desenvolver sistemas que evoluem na velocidade do...Indo além do técnico para desenvolver sistemas que evoluem na velocidade do...
Indo além do técnico para desenvolver sistemas que evoluem na velocidade do...Taller Negócio Digitais
 
Mitos do Desenvolvimento de Software
Mitos do Desenvolvimento de SoftwareMitos do Desenvolvimento de Software
Mitos do Desenvolvimento de Softwareguest2f8cba
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
 
Domain Driven Design - Aplicando estrategias e padrões
Domain Driven Design - Aplicando estrategias e padrõesDomain Driven Design - Aplicando estrategias e padrões
Domain Driven Design - Aplicando estrategias e padrõesJoao Paulo Oliveira dos Santos
 
A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!Isaac de Souza
 
Domain Driven Design - Uma introdução
Domain Driven Design - Uma introduçãoDomain Driven Design - Uma introdução
Domain Driven Design - Uma introduçãoDaniel Baptista Dias
 

Semelhante a Introdução a Domain-Driven Design (20)

Domain driven-design
Domain driven-designDomain driven-design
Domain driven-design
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
DDD
DDDDDD
DDD
 
Uma introdução ao Domain Driven Design
Uma introdução ao Domain Driven DesignUma introdução ao Domain Driven Design
Uma introdução ao Domain Driven Design
 
TDC - Qual o tamanho adequado de um micro serviço?
TDC - Qual o tamanho adequado de um micro serviço?TDC - Qual o tamanho adequado de um micro serviço?
TDC - Qual o tamanho adequado de um micro serviço?
 
Domain Driven Design com Python
Domain Driven Design com PythonDomain Driven Design com Python
Domain Driven Design com Python
 
Programando com prazer com DDD
Programando com prazer com DDDProgramando com prazer com DDD
Programando com prazer com DDD
 
DDD e Microsservicos - do negócio à arquitetura
DDD e Microsservicos - do negócio à arquiteturaDDD e Microsservicos - do negócio à arquitetura
DDD e Microsservicos - do negócio à arquitetura
 
Portfólio dos principais Serviços e Produtos | Bug BusterS
Portfólio dos principais Serviços e Produtos | Bug BusterSPortfólio dos principais Serviços e Produtos | Bug BusterS
Portfólio dos principais Serviços e Produtos | Bug BusterS
 
Domain-Driven-Design
Domain-Driven-DesignDomain-Driven-Design
Domain-Driven-Design
 
Domain-Driven-Design
 Domain-Driven-Design Domain-Driven-Design
Domain-Driven-Design
 
Indo além do técnico para desenvolver sistemas que evoluem na velocidade do...
Indo além do técnico para desenvolver sistemas que evoluem na velocidade do...Indo além do técnico para desenvolver sistemas que evoluem na velocidade do...
Indo além do técnico para desenvolver sistemas que evoluem na velocidade do...
 
Mitos do Desenvolvimento de Software
Mitos do Desenvolvimento de SoftwareMitos do Desenvolvimento de Software
Mitos do Desenvolvimento de Software
 
Introducao canvas
Introducao canvasIntroducao canvas
Introducao canvas
 
Introdução ao business model canvas
Introdução ao business model canvasIntrodução ao business model canvas
Introdução ao business model canvas
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Varejo Inteligente
Varejo InteligenteVarejo Inteligente
Varejo Inteligente
 
Domain Driven Design - Aplicando estrategias e padrões
Domain Driven Design - Aplicando estrategias e padrõesDomain Driven Design - Aplicando estrategias e padrões
Domain Driven Design - Aplicando estrategias e padrões
 
A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!A importância de DDD e o Domain Model na construção de APIs!
A importância de DDD e o Domain Model na construção de APIs!
 
Domain Driven Design - Uma introdução
Domain Driven Design - Uma introduçãoDomain Driven Design - Uma introdução
Domain Driven Design - Uma introdução
 

Introdução a Domain-Driven Design

  • 1. Domain-Driven Design Leandro A. Vieira Maicon C. Pereira
  • 4. Complexidade no Software Essencial Complexidade da Lógica do Negócio/Domínio Acidental Complexidade da Solução Técnica + Código Legado
  • 5.
  • 6. Big Ball Of Mud – Grande Bola de Lama • A arquitetura não é bem definida • Correções e pequenas evoluções tornam-se um grande desafio devido a dificuldade de entender o código • Evans: “BBoM é aquele código faz alguma coisa útil, mas sem explicar como”
  • 7. “DDD é sobre a redução de complexidade no software” Eric Evans
  • 8. DDD é sobre o negócio
  • 9. Domínio do Negócio (Domain) • Uma esfera de conhecimento • O que ela faz e como ela faz... • Cada empresa • tem o know-how do segmento/problema que ela atende • E o seu jeito de fazer • Conhecer o domínio é a parte mais importante do DDD
  • 10. Exemplo de Domínio • Se você estiver criando um software para gerenciar avaliações de desempenho dos funcionários, você precisará compreender • como as avaliações realmente funcionam, • todo o fluxo de trabalho, • as necessidades e expectativas dos clientes, • como isso afeta a folha de pagamento, etc.,
  • 11. DDD é sobre criar modelos altamente expressivos
  • 12. O que é um Modelo? • Simplificação da realidade • Mostra alguns aspectos da realidade ou uma ideia de interesse
  • 13. Como você representa seu modelo?
  • 14. Como você representa seu modelo? User Stories (Text) ?
  • 15. Como você representa seu modelo?
  • 16. Como você representa seu modelo?
  • 17. Modelo é uma representação mental Todo o resto são apenas ferramentas de comunicação
  • 18. Como construir um modelo no DDD ?
  • 19. Logo... • Domain expert acessível; • Alta interação entre o domain expert e o time de desenvolvimento; Manifesto Ágil • Indivíduos e interações mais que processos e ferramentas • Colaboração com o cliente mais que negociação de contratos • Princípio: Pessoas relacionadas à negócios e desenvolvedores devem trabalhar em conjunto e diariamente, durante todo o curso do projeto. http://www.manifestoagil.com.br
  • 20. Linguagem Ubíqua Baseado em uma linguagem comum Expresso em todos os níveis
  • 21.
  • 22. #SQN
  • 23. Tática sem estratégia é o ruído antes da derrota. Sun Tzu Arte da Guerra
  • 24. • Antes de colocar a mão na massa e falar sobre codificação, você deve entender o Problema • O DDD enfatiza • Suas terminologias (LU) • A razão pela qual está sendo desenvolvido • Quais são os fatores de sucesso para o negócio • A necessidade de a equipe de desenvolvimento valorizar o conhecimento do domínio, tanto quanto a experiência técnica
  • 26. Problema Domínio VendoLivros S/A Loja de Livros A VendoLivros S/A é uma empresa que comercializa apenas livros, seu grande diferencial está na entrega, que é bem mais rápida que seus concorrentes devido a sua grande expertise em logística e distribuição.
  • 28. Lei de Conway Presidência Vendas .. Marketing .. Pagamentos Estoque Entrega ... Resumo: A forma como as organizações estão estruturadas tem um forte impacto sobre os sistemas que elas criam "Qualquer empresa que projeta um sistema (definição mais ampla aqui do que apenas sistemas de informação), inevitavelmente produz um projeto cuja estrutura é uma cópia da estrutura de comunicação da organização.“ Melvin Conway (1968)
  • 29. Decompondo o problema Subdomínio Estoque RH, Financeiro Tesouraria ... Vendas Marketing Entrega Domínio VendoLivros Catálogo Pedidos Preços Localização Armazenamento Taxa de entrega Prazo de entrega Parceiros de transporte Propaganda Promoções Pagamentos Boleto Cartão de Crédito Presidên cia ndas .. Marketi ng .. Pagame ntos Estoque Entrega ...
  • 30. Decompondo o problema Subdomínio Estoque RH, Financeiro Tesouraria ... Vendas Marketing Entrega Pagamentos Domínio Principal (Core Domain) • Sucesso para o negócio • Focar todos os esforços
  • 31. Decompondo o problema Subdomínio Estoque RH, Financeiro Tesouraria ... Vendas Marketing Entrega Pagamentos Domínio Principal (Core Domain) • Sucesso para o negócio • Focar todos os esforços Subdomínio de Suporte • Essenciais mas não o core • Desenvolver ou comprar
  • 32. Decompondo o problema Subdomínio Estoque RH, Financeiro Tesouraria ... Vendas Marketing Entrega Pagamentos Domínio Principal (Core Domain) • Sucesso para o negócio • Focar todos os esforços Subdomínio de Suporte • Essenciais mas não o core • Desenvolver ou comprar Subdomínio Genérico • Não agrega valor para o negócio • Se possível, Comprar / Github
  • 33. Foco no Domínio Principal
  • 34. Foco no Domínio Principal Não perca tempo e esforço para refatorar todo o seu código, foque no domínio principal! Para subdomínios de suporte e genéricos, o código bom é o suficiente. A perfeição é uma ilusão, e deve ser reservada apenas para o que é essencial O negócio não se preocupa com a qualidade do código para as áreas que não são essenciais Scott Millett
  • 35. Decompondo o problema Modelo de Domínio (Domain Model) Estoque RH, Financeiro Tesouraria ... Vendas Marketing Entrega Pagamentos Representa a lógica de domínio e as regras de negócios que são relevantes para o subdomínio Modelo de Domínio Modelo de Domínio Modelo de Domínio Modelo de Domínio Modelo de Domínio Modelo de Domínio Livro
  • 38. Contextos Delimitados (Bounded Context) • Definem a maneira como um subdomínio será resolvido tecnicamente pela solução • Enquanto o conceito do Subdomínio pertence ao que chamamos de Espaço Problema, os Contextos Delimitados pertencem ao Espaço Solução
  • 40. Contextos Delimitados (Bounded Context) Contexto de Catálogo Contexto de Precificação Contexto de Pedidos Subdomínio de Vendas Contexto de Promoções Contexto de Publicidade Subdomínio de Marketing Contexto de Estoque Subdomínio de Estoque Contexto de Pagamento Subdomínio de Pagamento Contexto de Entrega Subdomínio de Entrega Contexto de ERP Legado Subdomínio de ERP Legado
  • 41. Contextos Delimitados (Bounded Context) Contexto de Catálogo Contexto de Precificação Contexto de Pedidos Subdomínio de Vendas Contexto de Promoções Contexto de Publicidade Subdomínio de Marketing Contexto de Estoque Subdomínio de Estoque Contexto de Pagamento Subdomínio de Pagamento Contexto de Entrega Subdomínio de Entrega Contexto de ERP Legado Subdomínio de ERP Legado Sistema VendoLivros Online
  • 42. Estoque RH, Financeiro Tesouraria ... Vendas Marketing Entrega Pagamentos Modelo de Domínio Modelo de Domínio Modelo de Domínio Modelo de Domínio Modelo de Domínio Modelo de Domínio Livro
  • 43. Contextos Delimitados (Bounded Context) Contexto de Catálogo Contexto de Precificação Contexto de Pedidos Subdomínio de Vendas Contexto de Promoções Contexto de Publicidade Subdomínio de Marketing Contexto de Estoque Subdomínio de Estoque Contexto de Pagamento Subdomínio de Pagamento Contexto de Entrega Subdomínio de Entrega Contexto de ERP Legado Subdomínio de ERP Legado • Tornar o Implícito Explicito • Define explicitamente o contexto dentro do qual um modelo se aplica. • É delimitado pela linguagem compartilhada • Protege seu modelo Livro Livro Livro Livro Livro Livro Livro
  • 44. Alinhe seus times à Contextos Delimitados
  • 45. Mapa de Contexto (Context Mapping)
  • 46. Mapa de Contexto • Estabelece uma visão da comunicação entre as equipes • Torna as delimitações dos contextos explícitos • Fornece a visão para possíveis alterações e evoluções • Estabelece um conjunto de padrões de comunicações • Núcleo compartilhado • Cliente Fornecedor • Conformista • Parceria • Camada de Anticorrupção • Linguagem Publicada
  • 47. Todas as relações tem suas motivações e seu preço...
  • 48. Núcleo Compartilhado (Shared Kernel) • Dois times compartilham um subconjunto de modelo de um mesmo subdomínio • Alterações dentro do núcleo compartilhado devem ser acordadas entre as duas equipes • Integração Contínua • Geralmente é o Domínio Principal Contexto de Folha de Pagamento Contexto de Recursos Humanos Modelo de Domínio Do Funcionário Subdomínio Recurso Humanos
  • 49. Baseado em direções • O Downstream é o lado do relacionamento que depende de dados ou comportamentos do lado Upstream Contexto Downstream Contexto Upstream
  • 50. Cliente/Fornecedor (Customer/Supplier) • É uma relação de cliente e fornecedor • Orçar/Estimar • Planejamento da entrega • Direito a veto, negociar com o Fornecedor • Interação – O team Cliente deve estar disponível para sanar dúvidas Contexto Vendas Contexto Pedidos Customer-Supplier Downstream Upstream Consome/utiliza de
  • 51. Cliente/Fornecedor (Customer/Supplier) • Testes automatizados • Escritos pela equipe de cliente (definindo a interface esperada) • Executados pela equipe Fornecedor (Para garantir que não estão quebrando nada) Contexto Vendas Contexto Pedidos Customer-Supplier Downstream Upstream Consome/utiliza de
  • 52. Cliente/Fornecedor (Customer/Supplier) • Equipes de Clientes/Fornecedores tem maior chance de sucesso se elas trabalham sob a mesma gerência e compartilham os mesmos objetivos Contexto Vendas Contexto Pedidos Customer-Supplier Downstream Upstream Consome/utiliza de
  • 53. Conformista (Conformist) • Não há colaboração entre o contexto downstream e o upstream • Muito comum em relacionamento com contextos que representam um sistema de terceiro, API... A A Contexto Vendas Contexto Pagamentos Conformista Downstream Upstream Consome/utiliza de
  • 54. Conformista (Conformist) • Se o Upstream é uma bagunça, essa bagunça será propagada para o Downstream • É caro criar uma camada de tradução para que os objetos do upstream não corrompem o modelo do downstream A A Contexto Vendas Contexto Pagamentos Conformista Downstream Upstream Consome/utiliza de
  • 55. Camada de Anticorrupção (Anti-Corruption Layer) • Criar uma camada para tradução entre os termos do Upstream para o modelo do Downstream, e vice-e-versa. • Protege o modelo de domínio de influências externas Contexto Vendas Contexto Pagamentos ACL Anti-Corruption Layer Downstream Upstream
  • 56. Camada de Anticorrupção (Anti-Corruption Layer)
  • 57. Parceria (Partnership) • Dependência mútua entre os contextos/equipes, elas obtém o sucesso ou fracasso juntas; • Possuem um objetivo em comum • Cooperam na evolução das interfaces para acomodar as necessidades de ambos • Entregas/Releases são alinhadas Contexto Vendas Contexto Pedidos Partnership
  • 58. Caminhos separados (Separate Ways) • Quando realmente não há relacionamento entre os contextos • Quando o custo de tradução é tão grande que é preferível a duplicação de parte do modelo e que eles sigam em Caminhos separados. Contexto Publicidade Contexto Entrega
  • 59. Linguagem Publicada (Published Language) • Quando você quer abrir seu contexto para integração com vários clientes • Se muitos contextos compartilham a mesma lógica de tradução, pode ser preferível que se tenha uma forma de acesso com interfaces claramente definidos • Define o protocolo de comunicação Serviço Aberto de Funcionalidades (Open/Host Service) • Quando você quer definir uma linguagem comum para comunicação
  • 60. Comunicação através de API REST, JSON/XML Contexto Pedido Contexto Estoque Contexto Entrega Contexto Catálogo OHS
  • 61. A estratégia sem tática é o caminho mais lento para a vitória. Sun Tzu Arte da Guerra
  • 64.
  • 65.
  • 67. Entidade (Entity) Tem uma identidade A igualdade é dada pelo seu ID (identidade) ad hoc setters
  • 68. Objeto de Valor (Value Object) Imutável Não tem uma identidade A sua igualdade é dada pelas suas propriedades Tem Regra de negócio
  • 69. Objeto de Valor (Value Object) • Reduz o code smell “Obsessão com tipos Primitivos”
  • 70. Agregado Raiz Entidade Objeto Valor Agregados (Aggregate) • Compostos de Entidades ou Objetos de Valores que são encapsulados numa única classe; • Serve para manter a integridade do modelo; • Possui uma raiz de agregação (Aggregate Root); • Único repositório por raiz de agregação;
  • 71. Serviço de Domínio (Domain Service) • Classes que contém uma lógica de negócio mas que não pertencem a nenhuma entidade ou objeto de valor; • Serviços não guardam estado (Stateless); • Toda chamada a um mesmo serviço, com a mesma pré-condição deve retornar o mesmo resultado. • Orquestrar entidades e encapsular regras de negócios; • Conceito de domínio que vem da LU e que envolve várias entidades; • Protege o modelo (entidade / objeto de valor)
  • 72. Evento de Domínio (Domain Event) • Notifica aos interessados que algo importante aconteceu no domínio; • Exemplo de eventos: • Livro entregue • Livro foi separado • Livro foi enviado • Pedido gerado • OCP – Aberto para extensão e fechado para alteração
  • 73. Critérios Técnicos Por Conceitos da LU Módulo (Module) • Divide o código por conceito (LU) e não por critério técnico; • São usados para decompor o modelo de domínio; • Permitem ao desenvolvedor ler e entender rapidamente o modelo do domínio; • Namespace / Projects
  • 74. Fábrica (Factory) • Utilize construtores apenas para criação de objetos simples, • Para objetos complexos utilize fábricas • Encapsula toda a lógica necessária para criar um Agregado em um estado consistente • Centraliza a lógica de criação • Utilize os padrões GoF: • Factory Method • Abstract Factory • Builder
  • 75. Repositório (Repository) • É o mecanismo que você deve usar para recuperar e persistir agregados • Persistência Agnóstica, é uma preocupação de infraestrutura, não do modelo • Pode ser útil se apoiar em estruturas de ORM (Entity Framework, NHibernate) • Um por Raiz de Agregação • Não é indicado para Relatórios e telas de consultas complexas
  • 76. Especificação (Specification) • Torna a regra de negócio implícita explicita • Utilizado principalmente para validações • Permite a criação de especificações compostas (utilizando E, OU, Não)
  • 77. Quando NÃO utilizar DDD Quando... • o domínio não é complexo, pode ser resolvido com um simples CRUD • a solução é muito mais técnica do que de negócio, Ex: Um framework • o Domain Expert não é acessível • você não tem um time motivado e qualificado • o processo de desenvolvimento é cascata
  • 78. Adotar DDD só porque é legal Ignorar o DDD porque o domínio parece ser pouco complexo
  • 79. E se você não seguir o DDD em aplicações complexas...? • Provavelmente você terá um modelo anêmico com muitos serviços • Regras de negócios ficam espalhadas em classes que não são do domínio • Difícil de mudar o sistema em uma alteração/evolução da regra de negócio • Comunicação negligenciada
  • 87. Conteúdo do Curso • Introdução • Linguagem Obíquoa • Domínios Ricos vs Domínios Anêmicos • Sub Domínios • Separação em Contextos Delimitados • Organizando a Solução • Definindo as Entidades • Corrupção no Código • SOLID e Clean Code • Primitive Obsession • Value Objects • Compartilhando Informações entre Contextos Delimitados • Testando as Entidades e VOs • Commands • Fail Fast Validations • Testando os Commands • Repository Pattern • Handlers • Testando os Handlers • Queries • Testando suas Queries http://live.balta.io/