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.
3. Notação
Classe Classe
atributo A atributo A
operação B operação B
Classe Classe
atributo A atributo A
operação B operação B
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
4. 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
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
5. Como um Atendente,
Eu quero registrar a entrada
em um estacionamento,
Para que possa cobrar pelo
tempo utilizado
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
6. Como um Atendente,
Eu quero registrar a saída do
estacionamento,
Para que possa cobrar pelo
tempo utilizado
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
10. Problema:
Como um Usuário,
Eu quero me cadastrar no
site sistema,
Para que possa utilizá-lo
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
25. Como um Atendente,
Eu quero indicar a vaga mais
apropriada para meu cliente,
Para que possa otimizar a
distribuição de carros
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
26. Como um Atendente,
Eu quero ver um relógio
marcando o tempo que o
cliente está estacionado,
Para que eu tome decisões
rapidamente
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
48. Identificando Camadas
• Separe as classes do modelo em suas
respectivas Camadas
• Refatore, se necessário
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
56. Como um Usuário,
Eu quero me cadastrar no site
sistema,
Para que possa utilizá-lo
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
57. Como um Usuário,
Eu quero me cadastrar no site
sistema,
Para que possa utilizá-lo
Ruído
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
58. Ruído Sintático
Como um Usuário,
Eu quero me cadastrar no site
sistema,
Para que possa utilizá-lo
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
75. 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
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
76. Como um Atendente,
Eu quero registrar a entrada
em um estacionamento,
Para que possa cobrar pelo
tempo utilizado
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
77. Como um Atendente,
Eu quero registrar a saída do
estacionamento,
Para que possa cobrar pelo
tempo utilizado
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
78. Como um Atendente,
Eu quero indicar a vaga mais
apropriada para meu cliente,
Para que possa otimizar a
distribuição de carros
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
79. Como um Atendente,
Eu quero ver um relógio
marcando o tempo que o
cliente está estacionado,
Para que eu tome decisões
rapidamente
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
83. Objetos com identidade Entity
Objetos definidos por
Value Object
seu valor
Lugar de onde obtemos
Repository
objetos
Interações entre objetos
Service
em uma dada ordem
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
84. Value Object
Saldo A = 100
Saldo B = 10 + 80 + 5 + 5
Saldo C = 90 - 12 + 6 + 6
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
85. Value Object
Data A = 25/12/1983
Data B = Natal de 1983
Data C = 6 dias para 1984
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
86. Conta Conta
Vencimento: 21/02/2008
Valor: R$4.000,00
== Vencimento: 21/02/2008
Valor: R$4.000,00
?
Credor: Casas da Banha Credor: Casas da Banha
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
87. Entity
Cliente Serviço
Toca Música Recomenda Música
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
88. Entity
Cliente Serviço
Los Hermanos!
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
89. Entity
Cliente Serviço
✓
Los Hermanos!
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
90. Entity
Cliente Serviço
✓
Los Hermanos!
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
91. Entity
Cliente Serviço
✓
Los Hermanos! Los Hermanos?
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
92. Entity
Cliente Serviço
✓ ?
Los Hermanos! Los Hermanos?
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
93. Entity
✓Identidade
✓Ciclo de Vida
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
94. Entity
✓Identidade
Chave Primária
Object ID
Hashcode
Definida pela
Linguagem do Domínio
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
95. Service
Mensagem
Módulo A Módulo B
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
96. Service
Mensagem
?
Módulo A Módulo B
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
97. Service
Mensagem
Roteador
Módulo A Módulo B
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
98. Service
✓Parte da Linguagem
✓Fluxo de ações sobre outros
objetos do domínio
✓Sem estado
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
99. Service
Atenção!
92,9245% do
que você achar
que são Services
não são!
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
100. Repository
(de onde vêm os bebês?)
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
102. Cliente
Código que Acessa
Repositório o Banco de Dados
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
103. Repository
✓Parte da Linguagem
✓Não deixa vazar detalhes de
implementação
✓Tenha o menor número
possível
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
109. Como um Contador,
Eu que as transações sejam
gerenciadas pelo meu
sistema,
Para evitar duplicação de
dados
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
110. Sistema Contábil
Envolvido
Credor
Transação
Devedor
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
127. Desenhando o Mapa
• Estabeleça a relação entre os dois
domínios em um diagrama
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
134. Anti-Corrupção
A B
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
135. 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
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
136. 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
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br
144. Como um Usuário,
Eu quero consultar minha
conta na Internet,
Para que possa pagá-la
http://fragmental.tw http://blog.fragmental.com.br http://www.caelum.com.br