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.
Una delle principali cause del fallimento di un software è la scarsa comunicazione con gli stakeholder …
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?
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); } }
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
“A single model cannot be appropriate for reporting, searching, and transactional behaviors…”
Greg Young
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
“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.
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.
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]