Workshop DDD

81
Domain Driven Design Workshop Mário Amaral @mario_fts github.com/mariofts [email protected] Saturday, September 6, 14

Transcript of Workshop DDD

Page 1: Workshop DDD

Domain Driven DesignWorkshop

Mário Amaral@mario_fts

github.com/[email protected]

Saturday, September 6, 14

Page 2: Workshop DDD

Quem sou eu?

•Mário Amaral• Instrutor e

desenvolvedor

• Caelum-Stella

• VRaptor4

Saturday, September 6, 14

Page 3: Workshop DDD

Vamos começar?

Saturday, September 6, 14

Page 4: Workshop DDD

Mas Primeiro...Saturday, September 6, 14

Page 5: Workshop DDD

Modelando nosso sistema!

Saturday, September 6, 14

Page 6: Workshop DDD

Saturday, September 6, 14

Page 7: Workshop DDD

Funcionalidades

Saturday, September 6, 14

Page 8: Workshop DDD

I - Why DDD?Saturday, September 6, 14

Page 9: Workshop DDD

Você já:

• Olhou para um código e não entendeu o que ele fazia?

• Programou alguma funcionalidade e não entendeu o que estava fazendo?

Saturday, September 6, 14

Page 10: Workshop DDD

Problema:

Comunicação

Saturday, September 6, 14

Page 11: Workshop DDD

Premissas

• “For most software projects, the primary focus should be on the domain and domain logic.”

• “Complex domain designs should be based on a model.”

Saturday, September 6, 14

Page 12: Workshop DDD

“Domain driven design is not a technology or a methodology. Its a way of thinking and a set of

priorities, aimed an accelerating software projects that have to deal with complicated domains.”

Saturday, September 6, 14

Page 13: Workshop DDD

Dividir para conquistar

Saturday, September 6, 14

Page 14: Workshop DDD

Camadas

Saturday, September 6, 14

Page 15: Workshop DDD

Saturday, September 6, 14

Page 16: Workshop DDD

User Interface

Application

Domain

Infrastructure

Saturday, September 6, 14

Page 17: Workshop DDD

Domain

Saturday, September 6, 14

Page 18: Workshop DDD

Comunicação

Saturday, September 6, 14

Page 19: Workshop DDD

Ruído sintático

• Causado pela diferença de representações

• Código != Linguagem escrita / falada

Saturday, September 6, 14

Page 20: Workshop DDD

Ruído Semântico

• Diferença entre como o usuário pensa em um conceito e como ele é implementado

• Erros de comunicação e entendimento

• Necessita de constante tradução

Saturday, September 6, 14

Page 21: Workshop DDD

RuídoSintático

RuídoSemântico

Saturday, September 6, 14

Page 22: Workshop DDD

RuídoSintático

RuídoSemântico } Domain Driven

Design

Saturday, September 6, 14

Page 23: Workshop DDD

RuídoSintático

RuídoSemântico }Domain Specific

Languages

Saturday, September 6, 14

Page 24: Workshop DDD

Como se livrar do rúido e melhorar a

comunicação ?

Saturday, September 6, 14

Page 25: Workshop DDD

Linguagem ubíqua

• Linguagem única de comunicação

• Baseada no domínio (negócio)

• Está em toda a parte

• Pode ser uma versão simplificada do domínio real

Saturday, September 6, 14

Page 26: Workshop DDD

Saturday, September 6, 14

Page 27: Workshop DDD

Posso usar DDD no meu sistema?

• Pré-requisitos

• Acesso aos especialistas de domínio

• Processo Iterativo

• Contexto definido

• Habilidade do time

Saturday, September 6, 14

Page 28: Workshop DDD

Vamos modelar?Saturday, September 6, 14

Page 29: Workshop DDD

Juntando os pedaçosE aplicando a linguagem ubíqua...

Saturday, September 6, 14

Page 30: Workshop DDD

II - Building BlocksSaturday, September 6, 14

Page 31: Workshop DDD

Patterns

• Entity

• Value Object

• Aggregates

• Service

• Repository

• Domain Event (Bonus Track)

Saturday, September 6, 14

Page 32: Workshop DDD

Entity

• Idéia de identidade

• Mutável

• Id não necessariamente o do banco

Saturday, September 6, 14

Page 33: Workshop DDD

Value Object

• Não tem identidade

• O importante é o valor que carregam

• Imutável

Saturday, September 6, 14

Page 34: Workshop DDD

Aggregates

• Associações entre Entities ou Value Objects

• Tem um objeto principal (root/raiz)

• Tratado como uma coisa só

• Sistema só deve manter referências para a raiz do aggregate

Saturday, September 6, 14

Page 35: Workshop DDD

Carro como AggregateSaturday, September 6, 14

Page 36: Workshop DDD

Services

• Ações que não pertencem a nenhum objeto do domínio

• Faze parte do domínio

• Stateless

• Deveriam existir poucos...

Saturday, September 6, 14

Page 37: Workshop DDD

Repository

• Abstrai do domínio o acesso a dados

• Coleções de objetos, mas com capacidade de queries avançadas

• Não necessariamente um por Entity

Saturday, September 6, 14

Page 38: Workshop DDD

Domain Events

• Capturar coisas que podem disparar uma mudança no estado do domínio

• Ótimo para integrar domínios diferentes

Saturday, September 6, 14

Page 39: Workshop DDD

Vamos modelar?Saturday, September 6, 14

Page 40: Workshop DDD

III - ContextsSaturday, September 6, 14

Page 41: Workshop DDD

Será que o sistema todo é uma coisa só?

Saturday, September 6, 14

Page 42: Workshop DDD

Os cegos e o elefanteJohn Godfrery Saxe (1816-1887)

Saturday, September 6, 14

Page 43: Workshop DDD

Saturday, September 6, 14

Page 44: Workshop DDD

Saturday, September 6, 14

Page 45: Workshop DDD

Saturday, September 6, 14

Page 46: Workshop DDD

Bounded Context

• Fronteira bem definida entre os diversos domínios dentro do sistema

• Delimita a aplicabilidade de um certo modelo.

Saturday, September 6, 14

Page 47: Workshop DDD

Um só contexto

Saturday, September 6, 14

Page 48: Workshop DDD

Múltiplos contextos

Saturday, September 6, 14

Page 49: Workshop DDD

Vários tipos de contextos

• Generic Subdomains

• Supporting Subdomain

• Core domain

Saturday, September 6, 14

Page 50: Workshop DDD

Generic Context

• Existe no seu sistema, e em muitos outros.

• Não é o foco, mas você precisa fazer.

• Ex: Contabilidade

• Pode ser comprado ou terceirizado completamente

Saturday, September 6, 14

Page 51: Workshop DDD

Supporting Context

• Específico seu

• Não é a funcionalidade principal do seu software

Saturday, September 6, 14

Page 52: Workshop DDD

Core domain

• Resolve o problema principal da empresa

• É por essa parte que as pessoas usam seu produto

• é suportado pelos outros contextos

• é a menor parte do sistema (geralmente)

Saturday, September 6, 14

Page 53: Workshop DDD

Saturday, September 6, 14

Page 54: Workshop DDD

Saturday, September 6, 14

Page 55: Workshop DDD

Saturday, September 6, 14

Page 56: Workshop DDD

Saturday, September 6, 14

Page 57: Workshop DDD

Outros Contextos

• Sistema legado

• Serviço remoto

• Partes do software que você não controla

• Base legada

Saturday, September 6, 14

Page 58: Workshop DDD

Vamos modelar?Saturday, September 6, 14

Page 59: Workshop DDD

IV - Integrating Contexts

Saturday, September 6, 14

Page 60: Workshop DDD

Como integrar contextos diferentes?

Saturday, September 6, 14

Page 61: Workshop DDD

Sempre haverão outros domínios

e outros modelos...

Saturday, September 6, 14

Page 62: Workshop DDD

Saturday, September 6, 14

Page 63: Workshop DDD

Context MapsTransition Map

Saturday, September 6, 14

Page 64: Workshop DDD

Context MapsTransition Map

U

U

UD

D

D

Saturday, September 6, 14

Page 65: Workshop DDD

Alguns patterns para integração

• Open Host Services

• Published Language

• Anti Corruption Layer

Saturday, September 6, 14

Page 66: Workshop DDD

Open Host Service

• O outro contexto é acessado por meio de um serviço

• Pode ser um serviço dentro do seu domínio, desde que isole o contexto

Saturday, September 6, 14

Page 67: Workshop DDD

Published Languages

• Modelo “público” daquele subdomínio

• Parecido com modelo canônico (SOA)

• Pode ser um subconjunto da linguagem daquele subdomínio

Saturday, September 6, 14

Page 68: Workshop DDD

Anti Corruption Layer

• Camada de conversão

• Evita que termos estranhos entrem no domínio

• Geralmente na ponta “D” da integração

• Não é parte do domíniox

Saturday, September 6, 14

Page 69: Workshop DDD

V - DDD in Legacy Systems

Saturday, September 6, 14

Page 70: Workshop DDD

Big Ball of MudSaturday, September 6, 14

Page 71: Workshop DDD

Bubble Context

• Não precisa de “muito DDD”

• Alguns dados do legado

• Isole o legado em uma bolha

• Consulte o que precisar e modifique para seu domínio (ACL)

Saturday, September 6, 14

Page 72: Workshop DDD

Saturday, September 6, 14

Page 73: Workshop DDD

Saturday, September 6, 14

Page 74: Workshop DDD

Autonomous Bubble

• Mais DDD

• Isole seu sistema do legado e faça a comunicação assíncrona

• Pode ser uma evolução da bolha

• Novo contexto autônomo (novo sistema?)

Saturday, September 6, 14

Page 75: Workshop DDD

Saturday, September 6, 14

Page 76: Workshop DDD

Saturday, September 6, 14

Page 77: Workshop DDD

LAAS - legacy as a service

• Pouco DDD

• Só algumas funcionalidades do legado

• Pouco acoplamento com o legado

Saturday, September 6, 14

Page 78: Workshop DDD

Domain Event Channel

• Mais DDD

• Desenvolvimento independente entre os contextos

• Comunicação entre os contextos é feito por eventos em um canal global

Saturday, September 6, 14

Page 79: Workshop DDD

Saturday, September 6, 14

Page 81: Workshop DDD

Domain Driven DesignWorkshop

Obrigado!Mário Amaral

@mario_ftsgithub.com/mariofts

[email protected]

Saturday, September 6, 14