Upload
mario-amaral
View
650
Download
0
Embed Size (px)
Citation preview
Domain Driven DesignWorkshop
Mário Amaral@mario_fts
github.com/[email protected]
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
Referências• http://domainlanguage.com/newsletter/2010-09/
• http://domainlanguage.com/newsletter/2011-06/
• http://www.infoq.com/presentations/design-strategic-eric-evans
• http://domainlanguage.com/ddd/patterns/DDD_Reference_2011-01-31.pdf
• http://www.laputan.org/mud/
• http://www.infoq.com/author/Eric-Evans
• http://dddcommunity.org
Saturday, September 6, 14
Domain Driven DesignWorkshop
Obrigado!Mário Amaral
@mario_ftsgithub.com/mariofts
Saturday, September 6, 14