Introdução a Domain-Driven Design

MaiconPereira 500 views 88 slides Nov 09, 2017
Slide 1
Slide 1 of 88
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88

About This Presentation

Apresentação realizada no Meetup
https://www.meetup.com/pt-BR/qualyteam/events/243888032/


Slide Content

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., Isso é o Domínio. 

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 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

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 Consome/utiliza de

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!