Come modelliamo gli aggregati? Qual è la strategia migliore per implementare un dominio complesso. Ci sono pattern ricorrenti nell’implementazione di applicazioni in DDD? Per quale motivo dovrei utilizzare CQRS? E se i Maya avessero avuto ragione e non ce ne fossimo accorti? Queste ed altre domande ancora…
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Ricette veloci per Domain-Driven Design by Alberto Brandolini
1. Ricette
veloci per
Domain-
Driven
Design
dal menù di
@ziobrando
venerdì 22 marzo 13
2. About me
In the IT field since ZX Spectrum
Generally in large scale projects (I might be biased)
Strategic IT Consultant
Trainer (Avanscoperta & Skills Matter)
Technical Writer
Blogger: http://ziobrando.blogspot.com
Twitter: @ziobrando
My e-mail: alberto.brandolini@gmail.com
venerdì 22 marzo 13
3. About me
Mi piace risolvere problemi
O scrivere software che li risolva
Blogger: http://ziobrando.blogspot.com
Twitter: @ziobrando
My e-mail: alberto.brandolini@gmail.com
venerdì 22 marzo 13
4. About me
In the IT field since ZX Spectrum
Generally in large scale projects (I might be biased)
Strategic IT Consultant
Trainer (Avanscoperta & Skills Matter)
Technical Writer
Blogger: http://ziobrando.blogspot.com
Twitter: @ziobrando
My e-mail: alberto.brandolini@gmail.com
venerdì 22 marzo 13
5. Aggregates
It is difficult to guarantee the consistency of
changes to objects in a model with complex
associations. Invariants need to be
maintained that apply to closely related
groups of objects, not just discrete objects.
An AGGREGATE is a cluster of associated
objects that we treat as a unit for the purpose of
data changes.
venerdì 22 marzo 13
28. Conceptual CQRS
Command to Domain Model raises
issues
Event
User
Read Model
influences notified to
influences
updates Projection
External
information
Warning! non è architettura...
venerdì 22 marzo 13
29. Qui decide l’utente
Command
issues
User
Read Model
influences influences
External
information
venerdì 22 marzo 13
31. User Steps
- L’utente decide quali comandi
invocare sul sistema sulla base
delle informazioni derivanti
dalla sua esperienza, e da
quanto reso disponibile
dall’applicazione
venerdì 22 marzo 13
32. Examples?
- Timesheet entry
venerdì 22 marzo 13
33. Conceptual CQRS
Command to Domain Model raises
issues
Event
User
Read Model
influences notified to
influences
updates Projection
External
information
venerdì 22 marzo 13
36. Conceptual CQRS
Command to Domain Model raises
issues
Event
User
Read Model
influences notified to
influences
updates Projection
External
information
venerdì 22 marzo 13
37. Aggregates
It is difficult to guarantee the consistency of
changes to objects in a model with complex
associations. Invariants need to be
maintained that apply to closely related
groups of objects, not just discrete objects.
An AGGREGATE is a cluster of associated
objects that we treat as a unit for the purpose of
data changes.
venerdì 22 marzo 13
40. Aggregate History
- Propagazione
- 2004 una generica “comunicazione
asincrona”
venerdì 22 marzo 13
41. Aggregate History
- Propagazione
- 2004 una generica “comunicazione
asincrona”
- 2010 ... Domain Events
venerdì 22 marzo 13
42. Aggregate History
- Propagazione
- 2004 una generica “comunicazione
asincrona”
- 2010 ... Domain Events
- Struttura interna:
venerdì 22 marzo 13
43. Aggregate History
- Propagazione
- 2004 una generica “comunicazione
asincrona”
- 2010 ... Domain Events
- Struttura interna:
- 2004: “Don’t fight your frameworks”
venerdì 22 marzo 13
44. Aggregate History
- Propagazione
- 2004 una generica “comunicazione
asincrona”
- 2010 ... Domain Events
- Struttura interna:
- 2004: “Don’t fight your frameworks”
- ORM / NoSQL / Event Sourcing /
Functional...
venerdì 22 marzo 13
45. Domain Model
Command to Domain Model raises
Event
venerdì 22 marzo 13
46. Domain Model
- Qui è dove è il sistema a
prendere le decisioni.
venerdì 22 marzo 13
47. I dati non sono tutti iguali
Il sistema prenderà una
decisone basandosi su
questi dati
..l’utente si baserà su
questi, ed altro...
venerdì 22 marzo 13
58. Uova al tegame
In presenza di sufficiente calore, l’albume
coagula più rapidamente del tuorlo. che è più
digeribile in forma liquida.
Un UOVO AL TEGAME si ottiene ponendo
l’uovo sgusciato su una superficie piana, calda e
non aderente, per un tempo sufficientemente
lungo da consentire la coagulazione dell’albume,
preservando il tuorlo.
venerdì 22 marzo 13
59. “Metti un po’ di
burro in padella,
apri l’uovo e cuoci”
venerdì 22 marzo 13
63. Invariant
An INVARIANT is a condition that can relied
upon to be true during the execution of a
program.
venerdì 22 marzo 13
64. Invarianti?
Totale = Somma(prezzoUnitario*quantità)
venerdì 22 marzo 13
65. Comandi?
CreateEmpty ItemAddedToCart
to raises
RemoveItem to Cart raises ItemRemovedFromCart
to raises
AddItem CartCreated
Totale = Somma(prezzoUnitario*quantità)
venerdì 22 marzo 13
66. Problema
- Il prezzo degli articoli può
variare.
venerdì 22 marzo 13
68. Quindi?
No, è che ha detto
[nome di uno troppo importante
per parlare con voi] che il prezzo
può cambiare...
venerdì 22 marzo 13
69. Quindi?
No, è che ha detto
[nome di uno troppo importante
per parlare con voi] che il prezzo
può cambiare...
...e va
implementata per
dopodomani.
venerdì 22 marzo 13
70. Quindi?
No, è che ha detto
[nome di uno troppo importante
per parlare con voi] che il prezzo
può cambiare...
...e va Doveva già essere
implementata per così.
dopodomani.
venerdì 22 marzo 13
73. Quindi?
Puoi farmi un
esempio?
venerdì 22 marzo 13
74. Esempio
- Given item stormtrooper clothing is
priced €500 each
- And customer ziobrando added 10
of stormtrooper clothing to cart
- When price for stormtrooper
clothing is updated to €750 each
- Then ???
venerdì 22 marzo 13
78. Ma anche...
Il
comportamento dell’utente
cambia se la variazione di prezzo è
favorevole o sfavorevole: possiamo
applicare immediatamente gli
sconti, e bloccare i rincari per
un giorno.
venerdì 22 marzo 13
79. Ma anche...
Il
comportamento dell’utente
cambia se la variazione di prezzo è
favorevole o sfavorevole: possiamo
applicare immediatamente gli
sconti, e bloccare i rincari per
un per
...ma solo giorno.
alcuni articoli
venerdì 22 marzo 13
84. Bello. Ma oggi...
...aggiorniamo i
prezzi nel carrello
venerdì 22 marzo 13
85. ItemPriceUpdated
to
<<EventHandler>>
<<Service>>
…?
raises CartPriceUpdated
UpdateItemPrice raises
to ItemAddedToCart
CreateEmpty to
raises
Cart raises ItemRemovedFromCart
to
RemoveItem raises
to CartCreated
AddItem
venerdì 22 marzo 13
87. Domain Model
- Qui è dove è il sistema a
prendere le decisioni.
- ...sulla basi di quali
informazioni?
venerdì 22 marzo 13
88. I dati non sono tutti iguali
Il sistema prenderà una
decisone basandosi su
questi dati
..l’utente si baserà su
questi, ed altro...
venerdì 22 marzo 13
90. Solo i dati significativi
per l’esecuzione sono
modellati
CreateEmpty ItemAddedToCart
to raises
RemoveItem to Cart raises ItemRemovedFromCart
to raises
AddItem CartCreated
...tutto il contenuto
informativo è propagato
attraverso gli eventi
venerdì 22 marzo 13
100. Che [*] é umami?
[*] = Colorita espressione regionale
venerdì 22 marzo 13
101. Che [*] é un
invariante?
[*] = Colorita espressione regionale
venerdì 22 marzo 13
102. 3 modelli
- Costruzione
- Esecuzione
- Controllo
venerdì 22 marzo 13
103. ...le invarianti si semplificano
- comportamento differenziato
- condizioni più precise
- possibilità di applicare una
differente semantica: es
warning vs blocker
- fare le domande giuste
venerdì 22 marzo 13
105. Comunque...
geteventstore.com
venerdì 22 marzo 13
106. Domain-Driven Design
Eric Evans
Enterprise Integration
Patterns
Gregor Hohpe, Bobby Woolf
Patterns of Enterprise
Application Architecture
Martin Fowler
Per saperne di più... www.avanscoperta.it
venerdì 22 marzo 13
107. Implementing Domain-Driven Design
Vaughn Vernon
http://www.amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577
Event Centric
Greg Young
http://www.amazon.com/Event-Centric-Simplicity-Addison-Wesley-Signature/dp/0321768221
Per saperne di più... www.avanscoperta.it
venerdì 22 marzo 13