144
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br Workshop 2009 Domain-Driven Design

(In Portuguese) Workshop de Domain-Driven Design

Embed Size (px)

DESCRIPTION

Slides utilizados nas turmas do workshop de Domain-Driven Design da Caelum ( http://www.caelum.com.br/curso/ws-46-domain-driven-design/ ) WS-46 | Domain-Driven Design A idéia é cobrir os principais aspectos desta filosofia de design de uma maneira descontraída mas substancial. O que Domain-Driven Design traz de volta é a possibilidade de utilizar as vantagens da Orientação a Objetos para criamos um modelo que reflita o mundo real de maneira mais íntima. Você não precisa sequer de objetos para aplicar o coração de Domain-Driven Design, ou mesmo seus Patterns. Neste contexto, DDD é programar para o domínio. Quando você usa esta técnica, seu software (sua camada de negócios, quase sempre) reflete o conhecimento do domínio do seu usário, você modela os conceitos do problema de uma maneira clara no software. Ao invés de simplesmente criar estruturas de dados e algoritmos, você implementa conceitos e através deles cria um entendimento muito maior sobre o que seu sistema faz para seus usuários, você e para quem for ler seu programa.

Citation preview

Page 3: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Classeatributo Aoperação B

Classeatributo Aoperação B

Classeatributo Aoperação B

Classeatributo Aoperação B

Notação

Page 4: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Modelando

•Aplicação Web

•Utilizando cartões CRC-like

•Da Interface até a base de dados/infra-estrutura

•Apenas para fins didáticos - não façam isso em casa

Page 5: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Atendente,Eu quero registrar a entrada em um estacionamento,Para que possa cobrar pelo tempo utilizado

Page 6: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Atendente,Eu quero registrar a saída do estacionamento,Para que possa cobrar pelo tempo utilizado

Page 9: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Problema:

Page 10: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Problema:

Como um Usuário,Eu quero me cadastrar no site sistema,Para que possa utilizá-lo

Page 12: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Decisão em Três Níveis

Qual? Como?O Quê?

Page 14: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Objetos

FunçõesProcedimentos

Qual material?

Page 25: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Atendente,Eu quero indicar a vaga mais apropriada para meu cliente,Para que possa otimizar a distribuição de carros

Page 26: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Atendente,Eu quero ver um relógio marcando o tempo que o cliente está estacionado,Para que eu tome decisões rapidamente

Page 29: (In Portuguese) Workshop de Domain-Driven Design
Page 30: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 31: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 32: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 33: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 34: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 35: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 36: (In Portuguese) Workshop de Domain-Driven Design
Page 37: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 38: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 39: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 40: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 41: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 42: (In Portuguese) Workshop de Domain-Driven Design

Mudança

Page 43: (In Portuguese) Workshop de Domain-Driven Design
Page 44: (In Portuguese) Workshop de Domain-Driven Design
Page 45: (In Portuguese) Workshop de Domain-Driven Design

Apresentação

Aplicação

Negócios

Infra-Estrutura

Page 46: (In Portuguese) Workshop de Domain-Driven Design

Domain-Driven Design

Page 48: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Identificando Camadas

• Separe as classes do modelo em suas respectivas Camadas

• Refatore, se necessário

Page 56: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Usuário,Eu quero me cadastrar no site sistema,Para que possa utilizá-lo

Page 57: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Usuário,Eu quero me cadastrar no site sistema,Para que possa utilizá-lo

Ruído

Page 58: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Usuário,Eu quero me cadastrar no site sistema,Para que possa utilizá-lo

Ruído Sintático

Page 66: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Ruído Sintático

RuídoSemântico

Domain-Driven Design}

Page 67: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Ruído Sintático

RuídoSemântico

Domain-Specific Languages}

Page 69: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Técnico Negócios

ClasseObjeto

DAO

Teste Unitário

Patterns

Thread

Segurança

Framework

ComposiçãoHerança

Vaga

Ocupante

Carro

Moto

Imposto

Gerente

Funcionário

Conta

Reserva

Manutenção

Manutenção

Page 75: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Identificando Ruído

• Identifique o que no Modelo faz parte do domínio técnico e de negócios

• Escreva um esboço do que seria a Linguagem deste domínio

Page 76: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Atendente,Eu quero registrar a entrada em um estacionamento,Para que possa cobrar pelo tempo utilizado

Page 77: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Atendente,Eu quero registrar a saída do estacionamento,Para que possa cobrar pelo tempo utilizado

Page 78: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Atendente,Eu quero indicar a vaga mais apropriada para meu cliente,Para que possa otimizar a distribuição de carros

Page 79: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Atendente,Eu quero ver um relógio marcando o tempo que o cliente está estacionado,Para que eu tome decisões rapidamente

Page 83: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Objetos com identidade Entity

Objetos definidos por seu valor Value Object

Lugar de onde obtemos objetos Repository

Interações entre objetos em uma dada ordem Service

Page 84: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Value Object

Saldo A = 100

Saldo B = 10 + 80 + 5 + 5

Saldo C = 90 - 12 + 6 + 6

Page 85: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Value Object

Data A = 25/12/1983

Data B = Natal de 1983

Data C = 6 dias para 1984

Page 86: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Conta

Vencimento: 21/02/2008Valor: R$4.000,00Credor: Casas da Banha

Conta

Vencimento: 21/02/2008Valor: R$4.000,00Credor: Casas da Banha

== ?

Page 87: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Entity

Cliente Serviço

Toca Música Recomenda Música

Page 91: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Entity

Cliente Serviço

✓Los Hermanos! Los Hermanos?

Page 92: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Entity

Cliente Serviço

✓ ?Los Hermanos! Los Hermanos?

Page 94: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Entity

✓IdentidadeChave Primária

Object IDHashcode

Definida pela Linguagem do Domínio

Page 95: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

ServiceMensagem

Módulo A

Módulo A

Módulo B

Page 96: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

ServiceMensagem

Módulo A

Módulo A

Módulo B

?

Page 97: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

ServiceMensagem

Módulo A

Módulo A

Módulo B

Roteador

Page 98: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Service

✓Parte da Linguagem✓Fluxo de ações sobre outros objetos do domínio✓Sem estado

Page 99: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Service

92,9245% do que você achar que são Services

não são!

Atenção!

Page 102: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Cliente

RepositórioCódigo que Acessa o Banco de Dados

Page 103: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Repository

✓Parte da Linguagem✓Não deixa vazar detalhes de implementação✓Tenha o menor número possível

Page 105: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Identificando Padrões

•Marque usando tags os padrões no seu domínio

Page 109: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Contador,Eu que as transações sejam gerenciadas pelo meu sistema,Para evitar duplicação de dados

Page 110: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Sistema Contábil

Transação

Envolvido

Credor

Devedor

Page 127: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Desenhando o Mapa

• Estabeleça a relação entre os dois domínios em um diagrama

Page 130: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Sistema Contábil

Transação

Envolvido

Credor

Devedor

Page 131: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Sistema Contábil

Transação

Envolvido

Credor

Devedor

Page 132: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Sistema Contábil

Transação

Devedor

Credor

Conta

Page 135: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Contexts, Map & Anti-Corruption

✓Nomes dos Bounded Contexts são parte da Linguagem✓Mapa precisa ser executável e verificável✓Anti-Corruption Layer não faz parte da Linguagem, deve ser abstraída

Page 136: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

O que são “Outros Domínios”?

‣“Pedaços” com linguagem diferente‣Sistemas legados‣Bases de dados legadas‣Serviços remotos‣Qualquer “pedaço” que você não controle

Page 144: (In Portuguese) Workshop de Domain-Driven Design

http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br

Como um Usuário,Eu quero consultar minha conta na Internet,Para que possa pagá-la