21 2012...Speaker: Manuel Scapolan Domain Driven Design Eʼ un insieme di principi che ci aiutano a...

41
DomainDriven Design Giovedì, 21 giugno 2012 Speaker: Manuel Scapolan

Transcript of 21 2012...Speaker: Manuel Scapolan Domain Driven Design Eʼ un insieme di principi che ci aiutano a...

Domain-­‐Driven  Design  

Giovedì, 21 giugno 2012

Speaker: Manuel Scapolan

Domain Driven Design

E’ un insieme di principi che ci aiutano a non fallire nel processo di sviluppo di un software *

* considerando tutte le fasi del ciclo di vita!

Alcuni dei più grandi fallimenti della storia:

Sources:  Business  Week,  CEO  Magazine,  Computerworld,  InfoWeek,  Fortune,  The  New  York  Times,  Time,  and  The  Wall  Street  Journal.  

DDD  What?  

Una delle principali cause del fallimento di un software è la scarsa comunicazione con gli stakeholder …

E’ necessario anticipare il momento in cui cominciamo a capirci qualcosa …

E’ importante conoscere e utilizzare lo stesso vocabolario degli esperti di dominio (domain experts) per poterlo poi condividere a tutti i livelli, fino al codice!

Ubiquitous Language

Parlare tutti lo stesso linguaggio dall’esperto di dominio, all’analista fino allo sviluppatore, significa portare nel codice i termini comunemente utilizzati dal business. Vuol dire che devo scrivere il codice in italiano??? In nome dell’Ubiquitous Language può essere necessario …

La conoscenza deve essere tradotta in un modello concettuale il più possibile fedele alla realtà da rappresentare secondo lo scopo dell’applicazione che ne deve fare uso

Domain Model

“An object model of the domain that incorporates both behavior and data”

Domain Model Pattern

Martin Fowler PoEAA

Mi stai forse dicendo che fare Domain-Driven Design significa realizzare un modello ad oggetti che rifletta la realtà che l’applicazione dovrà gestire? Non lo facevamo già questo con l’OOP? Ci sono forse delle indicazioni su come devo disegnare le mie classi?

Model-Driven Design - Building Blocks

2004  -­‐  Eric  Evans  

public class Order : IEquatable<Order> { public bool Equals(Order other) { return this.Id.Equals(other.Id); } }

Entities Elementi del dominio identificati in modo univoco indipendentemente dai valori dei loro attributi che possono variare nel tempo

Elementi del dominio identificati attraverso l’insieme dei loro attributi, generalmente immutabili, l’unico cambiamento è dato dalla completa sostituzione (no side-effect)

Value Objects

public class ShippingAddress : IEquatable< ShippingAddress > { public bool Equals(ShippingAddress other) { return this.Street.Equals(other. Street) && this.PostCode.Equals(other.PostCode) && this.City.Equals(other.City); } }

Aggregates Garantiscono al loro interno la consistenza delle informazioni

L’aggregato segue alla perfezione la regola dell’incapsulamento in quanto le entità e i value object che lo compongono non possono essere acceduti direttamente, ma devono essere manipolati attraverso l’entità definita come aggregate root. Ma allora come faccio l’accesso ai dati?

“Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.”

Repository Pattern

Architettura N-Tier

20  

Informazioni generali sul prodotto

Informazioni statistiche sui prodotti correlati

“A single model cannot be appropriate for reporting, searching, and transactional behaviors…”

Greg Young

22  

Informazioni statistiche aggiornate periodicamente

Per le informazioni in sola lettura (come ad esempio quelle statistiche) possiamo usare un modello costruito appositamente per velocizzare ricerche, query e filtri

Read Model

Ad esempio tra le classi di questo modello potrei avere BestSellerProductItem e BestSellerProductView

Read Model

Domain Model

Ma “two is meglio che one”!

Read Model

Domain Model

“Every method should either be a command that performs an action, or a query that returns data to the caller, but not both.”

Command-query separation (CQS) principle, Bertrand Meyer

Domain Model

Il Domain Model conserva e gestisce la logica di business con tutte le sue regole. Se pensiamo alle modifiche da applicare al modello sono sempre il frutto di una particolare richiesta o task. Ogni richiesta può essere benissimo tradotta nell’esecuzione di un comando ben preciso.

Una comune form di “data-entry”

Una versione Task-based

Ma come aggiorniamo la parte in sola lettura?

Ci vuole qualcosa che ci avvisi che il modello è cambiato …

… qualcosa come un Evento!

Read Model

Nella parte dedicata al Read Model una serie di event handlers catturano gli eventi del Domain Model invocando dei componenti chiamati “Denormalizer” che scompongono le informazioni trasmesse dall’evento e le utilizzano per aggiornare il database dedicato alla lettura.

… e come fa l’evento a raggiungere il suo handler?

… prende il Bus!

Message Bus

Se facciamo in modo che nell’evento ci sia la logica di applicazione delle modifiche possiamo pensare di salvare gli eventi e avere così un sistema che mi permetta di ricostruire lo stato di un aggregato a partire da una serie di eventi

Event Sourcing

Credits  

Slide  1:  http://www.=lickr.com/photos/26429107@N03/2508680764/  Slide  12:  http://www.=lickr.com/photos/14456988@N00/5730592664  Slide  17:  http://www.=lickr.com/photos/39384443@N00/3278857246/  

Le  immagini  contenute  in  questa  presentazione  delle  quali  non  è  stata  esplicitata  la  provenienza  hanno  licenza  Creative  Commons    

Thank  You   MANUEL  SCAPOLAN  website:    www.manuelscapolan.it  twitter:  manuelscapolan  e-­‐mail:  [email protected]