Domain Driven Design
Como modelar uma aplicação em Node.js com DDD ?
Por que DDD?
#polêmica
SoftwareMundo real
SoftwareMundo real
Incerto
Certo
SoftwareMundo real
Controlável
Não controlável
Incerto
Certo
Como fazer esta
transição?
Dificuldades
● Entender o negócio leva tempo
● O modelo mental do problema real geralmente não está bem definido
● Entender o problema a especificar bem leva tempo
Negócio Desenvolvedor
Problemas traiçoeiros
Negócios
● Tempo é escasso
● Desenvolvimento de software é
geralmente visto como um "centro de
custo" e não como um de "centro de
lucro"
● O software não satisfaz as
necessidades de negócio
Desenvolvimento
● Tempo é escasso
● A tecnologia é vista como mais
importante que o problema de negócio
● O modelo de software não reflete o
modelo de negócio
● "Big ball of mud"
● Modelos de dados quebrados e/ou "o
que era isso mesmo?"
E se incorporamos o
problema no software?
Negócio Desenvolvedor
Negócio Desenvolvedor
Negócio Desenvolvedor
Negócio Desenvolvedor
Negócio Desenvolvedor
Domain Driven Design
Design/Projeto dirigido ao domínio
● Domínio: é a área de interesse onde o software será desenvolvido
● Design/projeto: "esquematização"/ implementação dos requisitos no software
Arquitetura
Design / Projeto
Código
Domínio Modelo
Domínio Modelo
Domínio Modelo
Domínio ProjetoModelo
Design/Projeto dirigido ao domínio
● O modelo irá guiar como o software será projetado / desenvolvido
● O modelo será enriquecido através da aquisição de conhecimento, obtido ao longo do
desenvolvimento do software (linguagem úbiqua)
Design/Projeto dirigido ao domínio
Design/Projeto dirigido ao domínio
● O modelo irá guiar como o software será projetado / desenvolvido
● O modelo será enriquecido através da aquisição de conhecimento, obtido ao longo do
desenvolvimento do software (linguagem úbiqua)
● A modelagem não deve ser perfeccionista e sim efetiva
Domínio ProjetoModelo
Domínio ProjetoModelo
Domínio ProjetoModelo
Domínio Modelo Projeto
Domínio Modelo Projeto
Negócio Desenvolvedor
Linguagem
úbiqua
Design/Projeto dirigido ao domínio
● O modelo irá guiar como o software será projetado / desenvolvido
● O modelo será enriquecido através da aquisição de conhecimento, obtido ao longo do
desenvolvimento do software (linguagem úbiqua)
● A modelagem não deve ser perfeccionista e sim efetiva
● Projeto pode ser dividido em diferentes níveis:
○ Design/projeto tático
Entidades
Value
Objects
Agregados
Agregados
Domain
Services
Modules
Factories
Design/Projeto dirigido ao domínio
● O modelo irá guiar como o software será projetado / desenvolvido
● O modelo será enriquecido através da aquisição de conhecimento, obtido ao longo do
desenvolvimento do software (linguagem úbiqua)
● A modelagem não deve ser perfeccionista e sim efetiva
● Projeto pode ser dividido em diferentes níveis:
○ Design/projeto tático ("menor" unidade de software)
Design/Projeto dirigido ao domínio
● O modelo irá guiar como o software será projetado / desenvolvido
● O modelo será enriquecido através da aquisição de conhecimento, obtido ao longo do
desenvolvimento do software (linguagem úbiqua)
● A modelagem não deve ser perfeccionista e sim efetiva
● Projeto pode ser dividido em diferentes níveis:
○ Design/projeto tático ("menor" unidade de software)
○ Design/projeto estratégico
Design/Projeto dirigido ao domínio
● O modelo irá guiar como o software será projetado / desenvolvido
● O modelo será enriquecido através da aquisição de conhecimento, obtido ao longo do
desenvolvimento do software (linguagem úbiqua)
● A modelagem não deve ser perfeccionista e sim efetiva
● Projeto pode ser dividido em diferentes níveis:
○ Design/projeto tático ("menor" unidade de software)
○ Design/projeto estratégico (diversos softwares / serviços)
Let's code?
Fonte: http://www.agileandart.com/2010/07/16/ddd-introducao-a-domain-driven-design
Requisito: retrieve tweets
"I need to get a number of tweets with a specific hashtag, discover
the sentiment about the tweets and save for further analysis."
Requisito: retrieve tweets
"I need to get a number of tweets with a specific hashtag,
discover the sentiment about the tweets and save for further
analysis."
Requisito: retrieve tweets
"I need to get a number of tweets with a specific hashtag,
discover the sentiment about the tweets and save for further
analysis."
● Tweet entity
● Get tweets by hashtag behaviour
● Discover sentiment behaviour
● Save tweet behaviour
Obrigado !
danielbpdias@gmail.com
https://github.com/danielbdias/nodebr-meetup-ddd-demo

Domain Driven Design: como modelar uma aplicação em Node.js com DDD