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?
Domain Driven Design e CQRS
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 …
Ubiquitous Language
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!
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 …
Domain Model
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 Pattern
“An object model of the domain that
incorporates both behavior and data”
                             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
Entities
Elementi del dominio identificati in modo
univoco indipendentemente dai valori dei loro
attributi che possono variare nel tempo

public class Order : IEquatable<Order>
{
  public bool Equals(Order other)
  {
     return this.Id.Equals(other.Id);
  }
}
Value Objects
Elementi del dominio identificati attraverso
l’insieme dei loro attributi, generalmente
immutabili, l’unico cambiamento è dato dalla
completa sostituzione (no side-effect)

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);
  }
}
Garantiscono al loro
             interno la consistenza
Aggregates   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?
Repository Pattern
“Mediates between the domain and data
mapping layers using a collection-like interface
for accessing domain objects.”
Architettura N-Tier
Diapositiva lasciata intenzionalmente bianca




                                               20
Informazioni generali sul
prodotto




Informazioni statistiche
sui prodotti correlati




                            21
“A single model cannot be appropriate for
reporting, searching, and transactional
behaviors…”
                                 Greg Young
Informazioni statistiche
aggiornate periodicamente




                            23
Read Model
Per le informazioni in sola lettura
(come ad esempio quelle statistiche)
possiamo usare un modello costruito
appositamente per velocizzare
ricerche, query e filtri
Ad esempio tra le classi di questo modello potrei avere
BestSellerProductItem e BestSellerProductView
Domain Model




               Read Model
Ma “two is meglio che one”!
Domain Model




               Read 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
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
Domain Model   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!
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    Read Model
dedicato alla lettura.
… e come fa l’evento a raggiungere il
suo handler?
… prende il   Bus!


              Message Bus
Domain Driven Design e CQRS
DEMO
Vediamo un esempio di architettura CQRS
Event Sourcing
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
Domain Driven Design e CQRS
Credits
Le immagini contenute in questa presentazione delle
quali non è stata esplicitata la provenienza hanno
licenza Creative Commons

Slide 1: http://www.flickr.com/photos/26429107@N03/2508680764/
Slide 12: http://www.flickr.com/photos/14456988@N00/5730592664
Slide 17: http://www.flickr.com/photos/39384443@N00/3278857246/
Thank You   MANUEL SCAPOLAN
            website: www.manuelscapolan.it
            twitter: manuelscapolan
            e-mail: info@manuelscapolan.it

More Related Content

PDF
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
PDF
DMBOKをベースにしたデータマネジメント
PPTX
Vert.x vs akka
PDF
Software design and team design
PPTX
Design Patterns In Scala
PDF
軟體架構設計的技術養成之路
PPTX
Domain storytelling-one size fit all process
PDF
TensorRT Inference Serverではじめる、 高性能な推論サーバ構築
Jakarta EEとMicroprofileの上手な付き合い方と使い方 - JakartaOne Livestream Japan 2020
DMBOKをベースにしたデータマネジメント
Vert.x vs akka
Software design and team design
Design Patterns In Scala
軟體架構設計的技術養成之路
Domain storytelling-one size fit all process
TensorRT Inference Serverではじめる、 高性能な推論サーバ構築

What's hot (20)

PPTX
Qu'est ce qu'un logiciel de qualité
PDF
Oracle Database 11g,12cからのアップグレード対策とクラウド移行 (Oracle Cloudウェビナーシリーズ: 2021年7...
PPTX
CARTOって何?CARTOでできること
PDF
Chp5 - Les outils CASE
PDF
How to SRE when you have no SRE
PPT
Automatisation des tests
PPSX
Génie Logiciel : les tests
PPTX
Grafana optimization for Prometheus
PPTX
Oracle Database Vaultのご紹介
PDF
DevOps Best Practices
PDF
Cloud-Native CI/CD on Kubernetes with Tekton Pipelines
PPTX
コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話
PDF
實踐 Clean Architecture(實作高可用性的軟件架構)
PDF
ITサービスマネジメントとSRE
PDF
Feature toggling
PPTX
バッチは地味だが役に立つ
PPTX
DeNAが取り組む Software Engineer in Test
PDF
Oracle GoldenGate FAQ
PDF
Strategie de test à agile tour bordeaux
PDF
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Qu'est ce qu'un logiciel de qualité
Oracle Database 11g,12cからのアップグレード対策とクラウド移行 (Oracle Cloudウェビナーシリーズ: 2021年7...
CARTOって何?CARTOでできること
Chp5 - Les outils CASE
How to SRE when you have no SRE
Automatisation des tests
Génie Logiciel : les tests
Grafana optimization for Prometheus
Oracle Database Vaultのご紹介
DevOps Best Practices
Cloud-Native CI/CD on Kubernetes with Tekton Pipelines
コードレビュー改善のためにJenkinsとIntelliJ IDEAのプラグインを自作してみた話
實踐 Clean Architecture(實作高可用性的軟件架構)
ITサービスマネジメントとSRE
Feature toggling
バッチは地味だが役に立つ
DeNAが取り組む Software Engineer in Test
Oracle GoldenGate FAQ
Strategie de test à agile tour bordeaux
Anatomy of a Spring Boot App with Clean Architecture - Spring I/O 2023
Ad

Viewers also liked (20)

PDF
PDF
Scrum? E' come fare il bucato!
PDF
Knockout.js
PDF
AntiPatterns: i vizi del programmatore
PDF
Managed Extensibility Framework (MEF)
PDF
Tutte le novità di ASP.NET MVC3
PDF
TFS and Scrum - Lessons Learned
PPSX
Entity Framework 4.0 vs NHibernate
PDF
Transactions redefined
PDF
Layered Expression Trees feat. CQRS
PDF
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
PDF
C# e la Framework Class Library
PDF
Dai delegati a LINQ con C#
PDF
JavaScript Object Oriented
PDF
JavaScript
KEY
Stai guardando i dati sbagliati
PPTX
Costruire l'identità digitale con il piano editoriale
PDF
Liberate il kraken
PDF
Optimized for what
PDF
OOP with C#
Scrum? E' come fare il bucato!
Knockout.js
AntiPatterns: i vizi del programmatore
Managed Extensibility Framework (MEF)
Tutte le novità di ASP.NET MVC3
TFS and Scrum - Lessons Learned
Entity Framework 4.0 vs NHibernate
Transactions redefined
Layered Expression Trees feat. CQRS
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
C# e la Framework Class Library
Dai delegati a LINQ con C#
JavaScript Object Oriented
JavaScript
Stai guardando i dati sbagliati
Costruire l'identità digitale con il piano editoriale
Liberate il kraken
Optimized for what
OOP with C#
Ad

Similar to Domain Driven Design e CQRS (20)

PDF
Approccio Pratico al Domain Driven Design
PPT
Loosely Coupled Complexity - Unleash the power of your domain model
PPTX
Introduzione al Domain Driven Design (DDD)
PDF
Never Mind the Bollocks: here's the Domain Driven Design
PDF
Idiomatic Domain Driven Design
PPTX
Silverlight m v-vm @ DotNetteria
PDF
How I did it (in .NET): idiomatic Domain Driven Design
PPTX
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
PDF
AreaMVC: un'architettura software basata sulla semplicità
PDF
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
PDF
Code Contracts and Generics: implementing a LINQ-enabled Repository
PDF
Event based modelling and prototyping
PDF
Axon Framework - Dal monolite ai microservizi con un approccio evolutivo
PPTX
Inversion of Control @ CD2008
PDF
Open domus 2016
PDF
PPTX
Build a LINQ-enabled Repository
PDF
e-SUAP - General software architecture (Italiano)
PPT
Object oriented
PPT
Programmazione ad oggetti
Approccio Pratico al Domain Driven Design
Loosely Coupled Complexity - Unleash the power of your domain model
Introduzione al Domain Driven Design (DDD)
Never Mind the Bollocks: here's the Domain Driven Design
Idiomatic Domain Driven Design
Silverlight m v-vm @ DotNetteria
How I did it (in .NET): idiomatic Domain Driven Design
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
AreaMVC: un'architettura software basata sulla semplicità
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
Code Contracts and Generics: implementing a LINQ-enabled Repository
Event based modelling and prototyping
Axon Framework - Dal monolite ai microservizi con un approccio evolutivo
Inversion of Control @ CD2008
Open domus 2016
Build a LINQ-enabled Repository
e-SUAP - General software architecture (Italiano)
Object oriented
Programmazione ad oggetti

Domain Driven Design e CQRS

  • 1. Giovedì, 21 giugno 2012 Speaker: Manuel Scapolan
  • 2. 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!
  • 3. 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.
  • 6. Una delle principali cause del fallimento di un software è la scarsa comunicazione con gli stakeholder …
  • 7. E’ necessario anticipare il momento in cui cominciamo a capirci qualcosa …
  • 8. Ubiquitous Language 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!
  • 9. 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 …
  • 10. Domain Model 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
  • 11. Domain Model Pattern “An object model of the domain that incorporates both behavior and data” Martin Fowler PoEAA
  • 12. 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?
  • 13. Model-Driven Design - Building Blocks 2004 - Eric Evans
  • 14. Entities Elementi del dominio identificati in modo univoco indipendentemente dai valori dei loro attributi che possono variare nel tempo public class Order : IEquatable<Order> { public bool Equals(Order other) { return this.Id.Equals(other.Id); } }
  • 15. Value Objects Elementi del dominio identificati attraverso l’insieme dei loro attributi, generalmente immutabili, l’unico cambiamento è dato dalla completa sostituzione (no side-effect) 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); } }
  • 16. Garantiscono al loro interno la consistenza Aggregates delle informazioni
  • 17. 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?
  • 18. Repository Pattern “Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.”
  • 21. Informazioni generali sul prodotto Informazioni statistiche sui prodotti correlati 21
  • 22. “A single model cannot be appropriate for reporting, searching, and transactional behaviors…” Greg Young
  • 24. Read Model Per le informazioni in sola lettura (come ad esempio quelle statistiche) possiamo usare un modello costruito appositamente per velocizzare ricerche, query e filtri Ad esempio tra le classi di questo modello potrei avere BestSellerProductItem e BestSellerProductView
  • 25. Domain Model Read Model
  • 26. Ma “two is meglio che one”!
  • 27. Domain Model Read Model
  • 28. “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
  • 29. 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 Domain Model richiesta o task. Ogni richiesta può essere benissimo tradotta nell’esecuzione di un comando ben preciso.
  • 30. Una comune form di “data-entry”
  • 32. Ma come aggiorniamo la parte in sola lettura?
  • 33. Ci vuole qualcosa che ci avvisi che il modello è cambiato …
  • 34. … qualcosa come un Evento!
  • 35. 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 Read Model dedicato alla lettura.
  • 36. … e come fa l’evento a raggiungere il suo handler?
  • 37. … prende il Bus! Message Bus
  • 39. DEMO Vediamo un esempio di architettura CQRS
  • 40. Event Sourcing 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
  • 42. Credits Le immagini contenute in questa presentazione delle quali non è stata esplicitata la provenienza hanno licenza Creative Commons Slide 1: http://www.flickr.com/photos/26429107@N03/2508680764/ Slide 12: http://www.flickr.com/photos/14456988@N00/5730592664 Slide 17: http://www.flickr.com/photos/39384443@N00/3278857246/
  • 43. Thank You MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: info@manuelscapolan.it