ricette veloci per domain-driven design by alberto brandolini

109
Ricette veloci per Domain- Driven Design dal menù di @ziobrando venerdì 22 marzo 13

Upload: codemotion

Post on 01-Nov-2014

1.126 views

Category:

Technology


1 download

DESCRIPTION

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…

TRANSCRIPT

Page 1: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Ricette veloci per Domain-Driven Design

dal menù di @ziobrando

venerdì 22 marzo 13

Page 2: Ricette veloci per Domain-Driven Design by Alberto Brandolini

About meIn the IT field since ZX SpectrumGenerally in large scale projects (I might be biased)

Strategic IT ConsultantTrainer (Avanscoperta & Skills Matter)Technical Writer

Blogger: http://ziobrando.blogspot.comTwitter: @ziobrando

My e-mail: [email protected]

venerdì 22 marzo 13

Page 3: Ricette veloci per Domain-Driven Design by Alberto Brandolini

About me

Mi piace risolvere problemiO scrivere software che li risolva

Blogger: http://ziobrando.blogspot.comTwitter: @ziobrando

My e-mail: [email protected]

venerdì 22 marzo 13

Page 4: Ricette veloci per Domain-Driven Design by Alberto Brandolini

About meIn the IT field since ZX SpectrumGenerally in large scale projects (I might be biased)

Strategic IT ConsultantTrainer (Avanscoperta & Skills Matter)Technical Writer

Blogger: http://ziobrando.blogspot.comTwitter: @ziobrando

My e-mail: [email protected]

venerdì 22 marzo 13

Page 5: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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

Page 6: Ricette veloci per Domain-Driven Design by Alberto Brandolini

...quale miglior aggregato?

venerdì 22 marzo 13

Page 7: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Customer!

Customer

venerdì 22 marzo 13

Page 8: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Customer!

<<Entity>>Customer

venerdì 22 marzo 13

Page 9: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Customer!<<Aggregate Root>>

<<Entity>>Customer

venerdì 22 marzo 13

Page 10: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Customer!<<Aggregate Root>>

<<Entity>>Customer

nomecognome

venerdì 22 marzo 13

Page 11: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Customer!<<Aggregate Root>>

<<Entity>>Customer

nomecognomeusernameemailAddress

venerdì 22 marzo 13

Page 12: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Customer!<<Aggregate Root>>

<<Entity>>Customer

nomecognomeusernameemailAddressaddresscountrylanguage

venerdì 22 marzo 13

Page 13: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domande?

venerdì 22 marzo 13

Page 14: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domande?-Persistenza?

venerdì 22 marzo 13

Page 15: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domande?-Persistenza?

- Fa tutto lui! :-)

venerdì 22 marzo 13

Page 16: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domande?-Persistenza?

- Fa tutto lui! :-)

-Come gestisco address?

venerdì 22 marzo 13

Page 17: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domande?-Persistenza?

- Fa tutto lui! :-)

-Come gestisco address?

-Dove tengo la password?

venerdì 22 marzo 13

Page 18: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domande?-Persistenza?

- Fa tutto lui! :-)

-Come gestisco address?

-Dove tengo la password?

venerdì 22 marzo 13

Page 19: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domande?-Persistenza?

- Fa tutto lui! :-)

-Come gestisco address?

-Dove tengo la password?

venerdì 22 marzo 13

Page 20: Ricette veloci per Domain-Driven Design by Alberto Brandolini

È un mappazzone!

venerdì 22 marzo 13

Page 21: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Dov’è il comportamento?

venerdì 22 marzo 13

Page 22: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Riproviamo

venerdì 22 marzo 13

Page 23: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Trucco N°1-

CQRSCommand/Query Responsibility Segregation

venerdì 22 marzo 13

Page 24: Ricette veloci per Domain-Driven Design by Alberto Brandolini

?

! Architettura ottimizzata per i comandi

Architettura ottimizzata per le letture

venerdì 22 marzo 13

Page 25: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Aggregate

Aggregate

Command

Command

Event

Event

Event

EventEvent

EventEventEventEvent store

Domain Model

Projection

Projection

Read Model

DTO

DTO

Pre

sen

tati

on

UI

UI

UI

UI

venerdì 22 marzo 13

Page 26: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Non solo velocitàvenerdì 22 marzo 13

Page 27: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Non parleremo di questo...

venerdì 22 marzo 13

Page 28: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Conceptual CQRS

Command

User

issues

influences

External information

influencesRead Model

Domain Modelto

Event

raises

Projection

notified to

updates

Warning! non è architettura...venerdì 22 marzo 13

Page 29: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Qui decide l’utenteCommand

User

issues

influences

External information

influencesRead Model

venerdì 22 marzo 13

Page 30: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quali informazioni

venerdì 22 marzo 13

Page 31: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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

Page 32: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Examples?

-Timesheet entry

venerdì 22 marzo 13

Page 33: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Conceptual CQRS

Command

User

issues

influences

External information

influencesRead Model

Domain Modelto

Event

raises

Projection

notified to

updates

venerdì 22 marzo 13

Page 34: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Vi ho tolto il DB!

venerdì 22 marzo 13

Page 35: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Piangere non servirà a nulla...

venerdì 22 marzo 13

Page 36: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Conceptual CQRS

Command

User

issues

influences

External information

influencesRead Model

Domain Modelto

Event

raises

Projection

notified to

updates

venerdì 22 marzo 13

Page 37: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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

Page 38: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Aggregate History

venerdì 22 marzo 13

Page 39: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Aggregate History- Propagazione

venerdì 22 marzo 13

Page 40: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Aggregate History- Propagazione

- 2004 una generica “comunicazione asincrona”

venerdì 22 marzo 13

Page 41: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Aggregate History- Propagazione

- 2004 una generica “comunicazione asincrona”

- 2010 ... Domain Events

venerdì 22 marzo 13

Page 42: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Aggregate History- Propagazione

- 2004 una generica “comunicazione asincrona”

- 2010 ... Domain Events

- Struttura interna:

venerdì 22 marzo 13

Page 43: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Aggregate History- Propagazione

- 2004 una generica “comunicazione asincrona”

- 2010 ... Domain Events

- Struttura interna:

- 2004: “Don’t fight your frameworks”

venerdì 22 marzo 13

Page 44: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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

Page 45: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domain Model

Command Domain Modelto

Event

raises

venerdì 22 marzo 13

Page 46: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domain Model

-Qui è dove è il sistema a prendere le decisioni.

venerdì 22 marzo 13

Page 47: Ricette veloci per Domain-Driven Design by Alberto Brandolini

I dati non sono tutti igualiIl sistema prenderà una decisone basandosi su questi dati

..l’utente si baserà su questi, ed altro...

venerdì 22 marzo 13

Page 48: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Come lo preparo?

venerdì 22 marzo 13

Page 49: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domain Model

Command Domain Modelto

Event

raises

venerdì 22 marzo 13

Page 50: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Outside in

venerdì 22 marzo 13

Page 51: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Non ci guardo dentro...

venerdì 22 marzo 13

Page 52: Ricette veloci per Domain-Driven Design by Alberto Brandolini

...

venerdì 22 marzo 13

Page 53: Ricette veloci per Domain-Driven Design by Alberto Brandolini

...

...ma se devo prendere le informazioni da un’altro

aggregato?

venerdì 22 marzo 13

Page 54: Ricette veloci per Domain-Driven Design by Alberto Brandolini

venerdì 22 marzo 13

Page 55: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quando eri bambino aprivi i

cassetti in camera di mamma di tuoi amici

per annusare mutande?

venerdì 22 marzo 13

Page 56: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Tell don’t ask

venerdì 22 marzo 13

Page 57: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Ai fornelli

venerdì 22 marzo 13

Page 58: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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

Page 59: Ricette veloci per Domain-Driven Design by Alberto Brandolini

“Metti un po’ di burro in padella,

apri l’uovo e cuoci”

venerdì 22 marzo 13

Page 60: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Non avete bisogno di lui

venerdì 22 marzo 13

Page 61: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Basta lei

venerdì 22 marzo 13

Page 62: Ricette veloci per Domain-Driven Design by Alberto Brandolini

È un uovo!venerdì 22 marzo 13

Page 63: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Invariant

An INVARIANT is a condition that can relied upon to be true during the execution of a program.

venerdì 22 marzo 13

Page 64: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Invarianti?

Totale = Somma(prezzoUnitario*quantità)

venerdì 22 marzo 13

Page 65: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Comandi?

AddItem

Cartto

ItemAddedToCartraises

RemoveItem to ItemRemovedFromCartraises

CreateEmptyto

CartCreatedraises

Totale = Somma(prezzoUnitario*quantità)

venerdì 22 marzo 13

Page 66: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Problema

- Il prezzo degli articoli può variare.

venerdì 22 marzo 13

Page 67: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quindi?

venerdì 22 marzo 13

Page 68: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quindi?

No, è che ha detto [nome di uno troppo importante per parlare con voi] che il prezzo

può cambiare...

venerdì 22 marzo 13

Page 69: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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

Page 70: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quindi?

No, è che ha detto [nome di uno troppo importante per parlare con voi] che il prezzo

può cambiare...

...e va implementata per

dopodomani.

Doveva già essere così.

venerdì 22 marzo 13

Page 71: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Sòla...

venerdì 22 marzo 13

Page 72: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quindi?

venerdì 22 marzo 13

Page 73: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quindi?

Puoi farmi un esempio?

venerdì 22 marzo 13

Page 74: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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

Page 75: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quindi?

venerdì 22 marzo 13

Page 76: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Quindi?

...?

venerdì 22 marzo 13

Page 77: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Ma anche...

venerdì 22 marzo 13

Page 78: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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

Page 79: Ricette veloci per Domain-Driven Design by Alberto Brandolini

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....ma solo per alcuni articoli

venerdì 22 marzo 13

Page 80: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Che rumore sentite?

venerdì 22 marzo 13

Page 81: Ricette veloci per Domain-Driven Design by Alberto Brandolini

©  Alberto  Brandolini  2009

E’  necessario  un  processo  di  sviluppo  agile,  che  perme4a  di  

raccogliere  il  feedback  di  uten)  e  domain  experts,  in  iterazioni  brevi.

collaborazione creativa venerdì 22 marzo 13

Page 82: Ricette veloci per Domain-Driven Design by Alberto Brandolini

©  Alberto  Brandolini  2009

gli esperti ci aiutano a capire

e noi aiutiamo loro

venerdì 22 marzo 13

Page 83: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Bello. Ma oggi...

venerdì 22 marzo 13

Page 84: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Bello. Ma oggi...

...aggiorniamo i prezzi nel carrello

venerdì 22 marzo 13

Page 85: Ricette veloci per Domain-Driven Design by Alberto Brandolini

AddItem

Cart

to

ItemAddedToCartraises

RemoveItem to ItemRemovedFromCartraisesCreateEmpty to

CartCreatedraises

ItemPriceUpdated

<<EventHandler>><<Service>>

…?

to

raises

UpdateItemPriceto

CartPriceUpdated

raises

venerdì 22 marzo 13

Page 86: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Aggregates all’ostrica

venerdì 22 marzo 13

Page 87: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Domain Model

-Qui è dove è il sistema a prendere le decisioni.

- ...sulla basi di quali informazioni?

venerdì 22 marzo 13

Page 88: Ricette veloci per Domain-Driven Design by Alberto Brandolini

I dati non sono tutti igualiIl sistema prenderà una decisone basandosi su questi dati

..l’utente si baserà su questi, ed altro...

venerdì 22 marzo 13

Page 89: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Ho bisogno dell’albume?

venerdì 22 marzo 13

Page 90: Ricette veloci per Domain-Driven Design by Alberto Brandolini

AddItem

Cartto

ItemAddedToCartraises

RemoveItem to ItemRemovedFromCartraises

CreateEmptyto

CartCreatedraises

Solo i dati significativi per l’esecuzione sono modellati

...tutto il contenuto informativo è propagato attraverso gli eventi

venerdì 22 marzo 13

Page 91: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Che ci faccio con l’albume?

venerdì 22 marzo 13

Page 92: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Che ci faccio con l’albume?

venerdì 22 marzo 13

Page 93: Ricette veloci per Domain-Driven Design by Alberto Brandolini

...il read model!

Read Model

Event

Projection

notified to

updates

venerdì 22 marzo 13

Page 94: Ricette veloci per Domain-Driven Design by Alberto Brandolini

I sapori fondamentali

venerdì 22 marzo 13

Page 95: Ricette veloci per Domain-Driven Design by Alberto Brandolini

I sapori fondamentaliDolce

venerdì 22 marzo 13

Page 96: Ricette veloci per Domain-Driven Design by Alberto Brandolini

I sapori fondamentaliDolce

Amaro

venerdì 22 marzo 13

Page 97: Ricette veloci per Domain-Driven Design by Alberto Brandolini

I sapori fondamentaliDolce

Amaro

Salato

venerdì 22 marzo 13

Page 98: Ricette veloci per Domain-Driven Design by Alberto Brandolini

I sapori fondamentaliDolce

Amaro

Salato

Aspro

venerdì 22 marzo 13

Page 99: Ricette veloci per Domain-Driven Design by Alberto Brandolini

I sapori fondamentaliDolce

Amaro

Salato

Aspro

Umami

venerdì 22 marzo 13

Page 100: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Che [*] é umami?

[*] = Colorita espressione regionalevenerdì 22 marzo 13

Page 101: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Che [*] é un invariante?

[*] = Colorita espressione regionalevenerdì 22 marzo 13

Page 102: Ricette veloci per Domain-Driven Design by Alberto Brandolini

3 modelli

-Costruzione

-Esecuzione

-Controllo

venerdì 22 marzo 13

Page 103: Ricette veloci per Domain-Driven Design by Alberto Brandolini

...le invarianti si semplificano

- comportamento differenziato

- condizioni più precise

-possibilità di applicare una differente semantica: es warning vs blocker

- fare le domande giustevenerdì 22 marzo 13

Page 104: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Davvero avete così fretta?

venerdì 22 marzo 13

Page 105: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Comunque...

geteventstore.comvenerdì 22 marzo 13

Page 106: Ricette veloci per Domain-Driven Design by Alberto Brandolini

Per saperne di più... www.avanscoperta.it

Domain-Driven Design Eric Evans

Patterns of Enterprise Application ArchitectureMartin Fowler

Enterprise Integration Patterns

Gregor Hohpe, Bobby Woolf

venerdì 22 marzo 13

Page 108: Ricette veloci per Domain-Driven Design by Alberto Brandolini

venerdì 22 marzo 13