Workshop DDD

Preview:

Citation preview

Domain Driven DesignWorkshop

Mário Amaral@mario_fts

github.com/marioftsmario.amaral@caelum.com.br

Saturday, September 6, 14

Quem sou eu?

•Mário Amaral• Instrutor e

desenvolvedor

• Caelum-Stella

• VRaptor4

Saturday, September 6, 14

Vamos começar?

Saturday, September 6, 14

Mas Primeiro...Saturday, September 6, 14

Modelando nosso sistema!

Saturday, September 6, 14

Saturday, September 6, 14

Funcionalidades

Saturday, September 6, 14

I - Why DDD?Saturday, September 6, 14

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

Problema:

Comunicação

Saturday, September 6, 14

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

“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

Dividir para conquistar

Saturday, September 6, 14

Camadas

Saturday, September 6, 14

Saturday, September 6, 14

User Interface

Application

Domain

Infrastructure

Saturday, September 6, 14

Domain

Saturday, September 6, 14

Comunicação

Saturday, September 6, 14

Ruído sintático

• Causado pela diferença de representações

• Código != Linguagem escrita / falada

Saturday, September 6, 14

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

RuídoSintático

RuídoSemântico

Saturday, September 6, 14

RuídoSintático

RuídoSemântico } Domain Driven

Design

Saturday, September 6, 14

RuídoSintático

RuídoSemântico }Domain Specific

Languages

Saturday, September 6, 14

Como se livrar do rúido e melhorar a

comunicação ?

Saturday, September 6, 14

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

Saturday, September 6, 14

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

Vamos modelar?Saturday, September 6, 14

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

Saturday, September 6, 14

II - Building BlocksSaturday, September 6, 14

Patterns

• Entity

• Value Object

• Aggregates

• Service

• Repository

• Domain Event (Bonus Track)

Saturday, September 6, 14

Entity

• Idéia de identidade

• Mutável

• Id não necessariamente o do banco

Saturday, September 6, 14

Value Object

• Não tem identidade

• O importante é o valor que carregam

• Imutável

Saturday, September 6, 14

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

Carro como AggregateSaturday, September 6, 14

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

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

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

Vamos modelar?Saturday, September 6, 14

III - ContextsSaturday, September 6, 14

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

Saturday, September 6, 14

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

Saturday, September 6, 14

Saturday, September 6, 14

Saturday, September 6, 14

Saturday, September 6, 14

Bounded Context

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

• Delimita a aplicabilidade de um certo modelo.

Saturday, September 6, 14

Um só contexto

Saturday, September 6, 14

Múltiplos contextos

Saturday, September 6, 14

Vários tipos de contextos

• Generic Subdomains

• Supporting Subdomain

• Core domain

Saturday, September 6, 14

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

Supporting Context

• Específico seu

• Não é a funcionalidade principal do seu software

Saturday, September 6, 14

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

Saturday, September 6, 14

Saturday, September 6, 14

Saturday, September 6, 14

Saturday, September 6, 14

Outros Contextos

• Sistema legado

• Serviço remoto

• Partes do software que você não controla

• Base legada

Saturday, September 6, 14

Vamos modelar?Saturday, September 6, 14

IV - Integrating Contexts

Saturday, September 6, 14

Como integrar contextos diferentes?

Saturday, September 6, 14

Sempre haverão outros domínios

e outros modelos...

Saturday, September 6, 14

Saturday, September 6, 14

Context MapsTransition Map

Saturday, September 6, 14

Context MapsTransition Map

U

U

UD

D

D

Saturday, September 6, 14

Alguns patterns para integração

• Open Host Services

• Published Language

• Anti Corruption Layer

Saturday, September 6, 14

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

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

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

V - DDD in Legacy Systems

Saturday, September 6, 14

Big Ball of MudSaturday, September 6, 14

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

Saturday, September 6, 14

Saturday, September 6, 14

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

Saturday, September 6, 14

Saturday, September 6, 14

LAAS - legacy as a service

• Pouco DDD

• Só algumas funcionalidades do legado

• Pouco acoplamento com o legado

Saturday, September 6, 14

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

Saturday, September 6, 14

Domain Driven DesignWorkshop

Obrigado!Mário Amaral

@mario_ftsgithub.com/mariofts

mario.amaral@caelum.com.br

Saturday, September 6, 14

Recommended