SlideShare une entreprise Scribd logo
1  sur  49
Télécharger pour lire hors ligne
Idiomatic Domain Driven Design




Andrea Saltarello
andreas@manageddesigns.it
http://blogs.ugidotnet.org/pape
http://twitter.com/andysal74




   http://creativecommons.org/licenses/by-nc-nd/2.5/
DDD


Domain Driven Design:
• è un approccio alla realizzazione del
  software pensato per contenere la
  complessità
• Non è un silver bullet
Ubiquitous Language


E’ il linguaggio utilizzato nelle
discussioni tra tutti i partecipanti al
progetto, nei diagrammi, nella
documentazione e nel codice,
diventando così comune a tutti gli attori
che partecipano alla realizzazione del
software

Attenzione ai dialetti!
Ubiquitous Language: falsi positivi


Nella sua definizione di segno linguistico,
Ferdinand de Saussure distingue:
• un elemento formale, o esterno,
   costituito dal significante,
• e un elemento intrinseco, concettuale,
   costituito dal significato.
Qualsiasi segno esiste solo grazie alla
relazione tra significante e significato. In
altre parole, il significante è la forma,
fonica o grafica, utilizzata per richiamare
l'immagine che, nella nostra mente, è
associata a un determinato concetto, o
significato.
Bounded Context


Un Bounded Context è un contesto
all’interno del quale è valido uno
specifico ubiquitous language
Un sistema può quindi essere una
composizione di contesti differenti (es:
web store, accountability,
delivery&shipment …), comunicanti tra
di loro mediante una Context Map
Ogni bounded context è (quasi) un
sistema a sè
Architettura di DDD
Architettura di DDD

 è una layered architecture
 i layer Presentation e
 Infrastructure compaiono «per
 sport» nel diagramma
 i layer Application e Domain
 costituiscono quella che tipicamente
 chiamiamo «business logic»
   Domain: logica invariante per i casi
   d’uso
   Application: logica specifica ai casi d’uso
IL DOMAIN LAYER
Domain Layer: Key Concepts

  Il Domain Layer contiene la domain
  logic ed è composto da
    Model: Entità (identità e stato) e Valori
    (solo stato)
    Servizi
  Entità e Valori a runtime formano dei
  grafi di oggetti. I grafi dotati di
  “dignità propria” sono chiamati
  Aggregate e il sistema (es: i
  Repository) si “impegna” a gestirli
  correttamente ed atomicamente
  Le istanze di entità/aggregate sono
  costruite da Factory
Domain Model: precisazioni
                    Non stiamo
                    modellando la
                    realtà assoluta,
                    bensì un modello
                    funzionale
                    all’interno di un
                    bounded context
Da 0 ad Aggregate

  E' un insieme di elementi raggruppati in
  un’unità logica, quindi un grafo di oggetti
  Ha come radice l'entità principale
  dell'aggregato
  La radice è l’unico elemento che può essere
  referenziato fuori dai confini dell’aggregato
  Non è possibile agire direttamente sugli
  elementi senza passare dalla radice
  dell'aggregato
  L’aggregate ha la responsabilità di
  implementare la propria logica
Domain Model
Repository pattern
 Mediates between the domain and data mapping layers
 using a collection-like interface for accessing domain
 objects.

 Ricapitolando:
 • Interfaccia “collection like”
 • Gestisce la persistenza degli Aggregate
 • LINQ! (siamo dei buongustai )
IRepository<T>
Repository++


Quisquilie IT:
  Code Contracts
  Repository <3 IoC
APPLICATION LAYER
Application Layer: in teoria


Application Layer: defines the jobs the
software is supposed to do and directs the
expressive domain objects to work out
problems. The tasks this layer is
responsible for are meaningful to the
business or necessary for interaction with
the application layers of other systems.
This layer is kept thin. It does not contain
business rules or knowledge, but only
coordinates tasks and delegates work to
collaborations of domain objects in the
next layer down. It does not have state
reflecting the business situation, but it can
have state that reflects the progress of a
task for the user or the program.
Application Layer: in pratica


E’ un catalogo di servizi in grado di
effettuare il mesh della logica presente
nel domain layer esponendola alla
applicazione (es: presentation layer) in
una forma ad… alta digeribilità
PRESENTATION LAYER
Presentation Layer vs. DDD

Avere a disposizione un domain layer
«smart» è bello, ma costoso:
     Materializzazione degli oggetti
     Mesh della business logic

Tipicamente, si finisce per passare la vita
a «fare DTO»:
     Domain Layer <-> Application Layer
     Application Layer <-> Presentation Layer
MVC - Model View Controller

   Update state                               Set state
                            Model




         View             Change view        Controller

                           User action
                  View e Controller conoscono Model
                  Solo Controller agisce verso Model
                  View è passiva
                  Model è indipendente da View e Controller
MVC: Falsi miti


  Lo scopo del Controller non è di
  separare la View dal Model.

  La responsabilità del Controller è di
  fare da mediatore tra l'utente e
  l'applicazione, non tra la View e il
  Model.

  Nella “web suburbia” si dice MVC, ma
  si intende Model 2 [JSP specs]
Model 2


    In a Model 2 application, requests from the
    client browser are passed to the controller,
    which is a servlet. The controller decides
    which view (JSP) it will pass the request to.
    The view then invokes methods in a
    JavaBean (which may access a database)
    and returns the Response object to the
    Web container, which is then passed on to
    the client browser. [Wikipedia]
    Legenda:
•   Servlet->HttpHandler->Front Controller [P
    of EAA, 344]
•   JSP->Controller->Page Controller [P of EAA,
    333]
MVC @ Managed Designs


In bottega usiamo ASP.NET MVC dalle
prime CTP della v1, ed abbiamo
raggiunto una struttura
«standardizzata» dei progetti:
  Model 3
  Layered Expression Trees
MVC goes Model 3


 Model 2 separa il Controller in:
   Front Controller
   Page Controller
 Model 3 separa il Model in:
   View Model: rappresenta i dati che la
   view si impegna a presentare all’utente
   Worker Service: è la façade verso il
   Domain Layer che il page controller
   utilizza per produrre il View Model
   (Application Layer in DDD)
Never mind the bollocks, here’s the Model 3
Layered Expression Trees (LET idiom)

Facciamo un gioco: invece di definire un
«botto» di DTO, facciamo che layer e servizi si
scambino degli
IQueryable<YourFavouriteDomainEntity>,
facendo «emergere» la query e specificando la
proiezione solo all’ultimo momento?

L’espressione «Capra e cavoli» vi dice niente? 
C’mon Query LET’s go party (ah-ah-ah, yeah!)
MVVM Presentation Model




Represent the state and behavior of the
presentation independently of the GUI
controls used in the interface
The Presentation Model coordinates with
the domain layer and provides an
interface to the view that minimizes
decision making in the view.
MVVM vs. DDD

• WPF: il ViewModel può consumare il
  domain layer senza limitazioni
• Silverlight: il ViewModel non ha
  accesso al model
MVVM vs. Bottega51

• WPF: il ViewModel può consumare il
  domain layer senza limitazioni
• Silverlight: il ViewModel non ha
  accesso al model
Conclusioni


  DDD permette di «concepire» ed
  «organizzare» un sistema in modo
  efficace
  IQueryable<T> supporta DDD
  abbassando il costo della
  materializzazione degli oggetti
  ASP.NET MVC rocks!
Appendix 1

SOFTWARE ENGINEERING
Cosa è l’Architettura?



Secondo la definizione ISO/IEC 42010:

  “L’organizzazione basilare di un sistema,
     rappresentato dalle sue componenti, dalle
     relazioni che esistono tra di loro e con
     l’ambiente circostante, e dai principi che
     governano la sua progettazione e evoluzione."
ISO/IEC 42010 fact sheet
Titolo: IEEE Recommended Practice for Architectural
    Description of Software-Intensive Systems

Scope: This recommended practice addresses the architectural
   description of software-intensive systems. A software-
   intensive system is any system where software contributes
   essential influences to the design, construction, deployment,
   and evolution of the system as a whole.

architect: The person, team, or organization responsible for
   systems architecture.

architecting: The activities of defining, documenting,
   maintaining, improving, and certifying properimplementation
   of an architecture.

architecture: The fundamental organization of a system
   embodied in its components, their relationships to each
   other, and to the environment, and the principles guiding its
   design and evolution.
Architettura: cosa?


L’architettura di un sistema *è*
   definita durante la fase di
   progettazione.

L’architettura *non è* parte
   dell’analisi:
  l’analisi si concentra su cosa debba fare il
  sistema
  La progettazione si concentra su come
  debba farlo
Architetto: le responsabilità
L’architetto:
   Recepisce i requisiti funzionali (emersi durante
   l’analisi) e quelli non funzionali (es: HA,
   scalabilità, security …)
   Suddivide i grandi sistemi in (layer di) sottosistemi
   individualmente assegnabili ad uno sviluppatore o
   ad un gruppo di lavoro
   Effettua una analisi del rapporto costi/benefici per
   determinare il miglior modo di soddisfare i
   requisiti, eventualmente ricorrendo a componenti
   commerciali o comunque già sviluppati
   Genera “specifiche”: sketch, modelli o prototipi per
   comunicare al gruppo di lavoro le modalità di
   realizzazione
Architettura: luoghi comuni


  Architetto != Analista
  Architetto != Project Manager
  Architettura != Design
    Al limite… Design  Architettura
Architettura: rappresentazione

L’architettura si rappresenta mediante
   le view, che sono la rappresentazione
   del sistema osservato da un certo
   view point.

Tutto fa brodo, ma ISO 19501 (UML)
  offre alcuni view point “significativi”
  espressi con una notazione
  *standard*
Requisito: una definizione


1. Condizione o capacità che occorre
   all’utente per risolvere un problema
   o raggiungere un obiettivo
2. Condizione o capacità che deve
   essere raggiunta o posseduta dal
   sistema per soddisfare un
   contratto, standard, specifica o
   altro documento formale
3. La rappresentazione
   documentata di una condizione o
   capacità (1 o 2)
Requisiti: la teoria


La norma ISO9126, pubblicata nella
  sua prima versione nel 1991, ha
  definito il modello dei requisiti
  qualitativi del software.
Secondo tale modello i requisiti sono
  raggruppabili in 6 "caratteristiche" e
  in 21 "sottocaratteristiche“, distinte
  fra caratteristiche esterne (orientate
  all’utente) e caratteristiche interne
  (orientate allo sviluppo e
  manutenzione).
Funzionalità


Capacità di soddisfare esigenze
  esplicite od implicite.
    Idoneità = funzionalità appropriate per
    specificati compiti
    Accuratezza = precisione dei risultati
    Interoperabilità = capacità di interagire
    con altre applicazioni
    Sicurezza = protezione da utilizzi non
    autorizzati
    Concordanza = aderenza a standard o
    regolamentazioni legislative
Disponibilità


Capacità di fornire una continuità di
  servizio
    Maturità = mancanza di interruzioni per
    malfunzionamenti
    Tolleranza = ridotto degrado in caso di
    malfunzionamenti
    Recupero = capacità e velocità di
    ripristino dopo interruzioni
Usabilità


Facilità di utilizzo da parte degli utenti
     Comprensione = acquisizione di
     adeguato livello di conoscenza
     Apprendimento = velocità di
     familiarizzazione
     Utilizzabilità = facilità di uso e controllo
     Attrattiva = livello di gradimento
     nell’utilizzo
Efficienza


Capacità di fornire prestazioni adeguate
    Tempo Risposta = reattività agli stimoli
    dell’utente
    Utilizzo risorse = utilizzo adeguato delle
    risorse del sistema
Manutenibilità


Facilità di manutenzione correttiva e
  evolutiva
    Analizzabilità = facilità di diagnosi e
    identificazione componenti
    Modificabilità = facilità di inserimento di
    modifiche
    Stabilità = limitazione di effetti
    indesiderati derivanti da modifiche
    Collaudabilità = facilità di testare le
    modifiche apportate
Portabilità


Trasferibilità da un ambiente all’altro
     Adattabilità = facilità di adeguamento
     ad un nuovo ambiente
     Installabilità = velocità e completezza di
     installazione
     Coesistenza = capacità di risiedere con
     altre applicazioni nello stesso ambiente
     Sostituibilità = capacità di rimpiazzare
     un’altra applicazione con simili
     funzionalità
Recepire i requisiti


La mancanza di requisiti o la
  mancanza della loro gestione sono
  tra le cause principali del fallimento
  dei progetti
Recepire i requisiti significa
  circoscrivere il problema
Strumenti utilizzati in bottega:
• Use case
• User story
FINE

Contenu connexe

En vedette

Generic Repository Pattern with ASP.NET MVC and EF
Generic Repository Pattern with ASP.NET MVC and EFGeneric Repository Pattern with ASP.NET MVC and EF
Generic Repository Pattern with ASP.NET MVC and EFMd. Mahedee Hasan
 
The world of enterprise solution development with asp.net and C#
The world of enterprise solution development with asp.net and C#The world of enterprise solution development with asp.net and C#
The world of enterprise solution development with asp.net and C#Md. Mahedee Hasan
 
Dependency Injection in Scala - Beyond the Cake Pattern
Dependency Injection in Scala - Beyond the Cake PatternDependency Injection in Scala - Beyond the Cake Pattern
Dependency Injection in Scala - Beyond the Cake PatternDebasish Ghosh
 
Approccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignApproccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignLuca Milan
 
The Why and How of Scala at Twitter
The Why and How of Scala at TwitterThe Why and How of Scala at Twitter
The Why and How of Scala at TwitterAlex Payne
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModelDotNetMarche
 
Functional Patterns in Domain Modeling
Functional Patterns in Domain ModelingFunctional Patterns in Domain Modeling
Functional Patterns in Domain ModelingDebasish Ghosh
 
Risorse digitali e repository
Risorse digitali e repositoryRisorse digitali e repository
Risorse digitali e repositorymasseroni
 
RDF, SPARQL and Semantic Repositories
RDF, SPARQL and Semantic RepositoriesRDF, SPARQL and Semantic Repositories
RDF, SPARQL and Semantic RepositoriesMarin Dimitrov
 
Step by step guide to basic web dynpro abap
Step by step guide to basic web dynpro abapStep by step guide to basic web dynpro abap
Step by step guide to basic web dynpro abapKranthi Kumar
 

En vedette (14)

Web dynpro for abap 01
Web dynpro for abap 01Web dynpro for abap 01
Web dynpro for abap 01
 
Corso ABAP OO 04
Corso ABAP OO  04Corso ABAP OO  04
Corso ABAP OO 04
 
Corso ABAP OO 01
Corso ABAP OO   01Corso ABAP OO   01
Corso ABAP OO 01
 
Generic Repository Pattern with ASP.NET MVC and EF
Generic Repository Pattern with ASP.NET MVC and EFGeneric Repository Pattern with ASP.NET MVC and EF
Generic Repository Pattern with ASP.NET MVC and EF
 
The world of enterprise solution development with asp.net and C#
The world of enterprise solution development with asp.net and C#The world of enterprise solution development with asp.net and C#
The world of enterprise solution development with asp.net and C#
 
Dependency Injection in Scala - Beyond the Cake Pattern
Dependency Injection in Scala - Beyond the Cake PatternDependency Injection in Scala - Beyond the Cake Pattern
Dependency Injection in Scala - Beyond the Cake Pattern
 
Ddd brutto sporco e cattivo
Ddd brutto sporco e cattivoDdd brutto sporco e cattivo
Ddd brutto sporco e cattivo
 
Approccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignApproccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven Design
 
The Why and How of Scala at Twitter
The Why and How of Scala at TwitterThe Why and How of Scala at Twitter
The Why and How of Scala at Twitter
 
Model-View-ViewModel
Model-View-ViewModelModel-View-ViewModel
Model-View-ViewModel
 
Functional Patterns in Domain Modeling
Functional Patterns in Domain ModelingFunctional Patterns in Domain Modeling
Functional Patterns in Domain Modeling
 
Risorse digitali e repository
Risorse digitali e repositoryRisorse digitali e repository
Risorse digitali e repository
 
RDF, SPARQL and Semantic Repositories
RDF, SPARQL and Semantic RepositoriesRDF, SPARQL and Semantic Repositories
RDF, SPARQL and Semantic Repositories
 
Step by step guide to basic web dynpro abap
Step by step guide to basic web dynpro abapStep by step guide to basic web dynpro abap
Step by step guide to basic web dynpro abap
 

Similaire à Idiomatic Domain Driven Design

Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRSManuel Scapolan
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)DotNetMarche
 
AreaMVC: un'architettura software basata sulla semplicità
AreaMVC: un'architettura software basata sulla semplicitàAreaMVC: un'architettura software basata sulla semplicità
AreaMVC: un'architettura software basata sulla semplicitàGiulio Destri
 
e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)Sabino Labarile
 
How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignAndrea Saltarello
 
SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angulardotnetcode
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsAndrea Dottor
 
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1massimiliano.wosz
 
Repository pattern slides v1.1
Repository pattern slides v1.1Repository pattern slides v1.1
Repository pattern slides v1.1Christian Nastasi
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide SitoDavide Sito
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingAndrea Bozzoni
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webLuca Milan
 
Spring Framework
Spring FrameworkSpring Framework
Spring FrameworkNaLUG
 
Riuso Object Oriented
Riuso Object OrientedRiuso Object Oriented
Riuso Object OrientedStefano Fago
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryCode Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryAndrea Saltarello
 
Design pattern architetturali Model View Controller, MVP e MVVM
Design pattern architetturali   Model View Controller, MVP e MVVMDesign pattern architetturali   Model View Controller, MVP e MVVM
Design pattern architetturali Model View Controller, MVP e MVVMRiccardo Cardin
 
SUE AGILE MVVM (Italian)
SUE AGILE MVVM (Italian)SUE AGILE MVVM (Italian)
SUE AGILE MVVM (Italian)Sabino Labarile
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTfirenze-gtug
 
Alm pills - Sessione community tour Dot Net Umbria 2011
Alm pills - Sessione community tour Dot Net Umbria 2011Alm pills - Sessione community tour Dot Net Umbria 2011
Alm pills - Sessione community tour Dot Net Umbria 2011Gian Maria Ricci
 

Similaire à Idiomatic Domain Driven Design (20)

Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRS
 
Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)Introduzione al Domain Driven Design (DDD)
Introduzione al Domain Driven Design (DDD)
 
AreaMVC: un'architettura software basata sulla semplicità
AreaMVC: un'architettura software basata sulla semplicitàAreaMVC: un'architettura software basata sulla semplicità
AreaMVC: un'architettura software basata sulla semplicità
 
e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)
 
How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven Design
 
SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)
 
Meetup ASP.NET Core Angular
Meetup ASP.NET Core AngularMeetup ASP.NET Core Angular
Meetup ASP.NET Core Angular
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
 
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1
 
Repository pattern slides v1.1
Repository pattern slides v1.1Repository pattern slides v1.1
Repository pattern slides v1.1
 
Progetto SOD Davide Sito
Progetto SOD Davide SitoProgetto SOD Davide Sito
Progetto SOD Davide Sito
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
Riuso Object Oriented
Riuso Object OrientedRiuso Object Oriented
Riuso Object Oriented
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryCode Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled Repository
 
Design pattern architetturali Model View Controller, MVP e MVVM
Design pattern architetturali   Model View Controller, MVP e MVVMDesign pattern architetturali   Model View Controller, MVP e MVVM
Design pattern architetturali Model View Controller, MVP e MVVM
 
SUE AGILE MVVM (Italian)
SUE AGILE MVVM (Italian)SUE AGILE MVVM (Italian)
SUE AGILE MVVM (Italian)
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWT
 
Alm pills - Sessione community tour Dot Net Umbria 2011
Alm pills - Sessione community tour Dot Net Umbria 2011Alm pills - Sessione community tour Dot Net Umbria 2011
Alm pills - Sessione community tour Dot Net Umbria 2011
 

Plus de Andrea Saltarello

Da Rotor a .NET Core ed indietro: Microsoft &lt;3 Open Source
Da Rotor a .NET Core ed indietro: Microsoft &lt;3 Open SourceDa Rotor a .NET Core ed indietro: Microsoft &lt;3 Open Source
Da Rotor a .NET Core ed indietro: Microsoft &lt;3 Open SourceAndrea Saltarello
 
The Fine Art of Time Travelling: implementing Event Sourcing
The Fine Art of Time Travelling: implementing Event SourcingThe Fine Art of Time Travelling: implementing Event Sourcing
The Fine Art of Time Travelling: implementing Event SourcingAndrea Saltarello
 
Implementing Event Sourcing in .NET
Implementing Event Sourcing in .NETImplementing Event Sourcing in .NET
Implementing Event Sourcing in .NETAndrea Saltarello
 
Idiomatic Domain Driven Design: implementing CQRS
Idiomatic Domain Driven Design: implementing CQRSIdiomatic Domain Driven Design: implementing CQRS
Idiomatic Domain Driven Design: implementing CQRSAndrea Saltarello
 
Architecting an ASP.NET MVC Solution
Architecting an ASP.NET MVC SolutionArchitecting an ASP.NET MVC Solution
Architecting an ASP.NET MVC SolutionAndrea Saltarello
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSAndrea Saltarello
 
Build a LINQ-enabled Repository
Build a LINQ-enabled RepositoryBuild a LINQ-enabled Repository
Build a LINQ-enabled RepositoryAndrea Saltarello
 
Layered Expression Trees: una terza via (idiomatica) verso il DDD
Layered Expression Trees: una terza via (idiomatica) verso il DDDLayered Expression Trees: una terza via (idiomatica) verso il DDD
Layered Expression Trees: una terza via (idiomatica) verso il DDDAndrea Saltarello
 
From relational data to object spaces
From relational data to object spacesFrom relational data to object spaces
From relational data to object spacesAndrea Saltarello
 

Plus de Andrea Saltarello (11)

Da Rotor a .NET Core ed indietro: Microsoft &lt;3 Open Source
Da Rotor a .NET Core ed indietro: Microsoft &lt;3 Open SourceDa Rotor a .NET Core ed indietro: Microsoft &lt;3 Open Source
Da Rotor a .NET Core ed indietro: Microsoft &lt;3 Open Source
 
The Fine Art of Time Travelling: implementing Event Sourcing
The Fine Art of Time Travelling: implementing Event SourcingThe Fine Art of Time Travelling: implementing Event Sourcing
The Fine Art of Time Travelling: implementing Event Sourcing
 
Implementing Event Sourcing in .NET
Implementing Event Sourcing in .NETImplementing Event Sourcing in .NET
Implementing Event Sourcing in .NET
 
Idiomatic Domain Driven Design: implementing CQRS
Idiomatic Domain Driven Design: implementing CQRSIdiomatic Domain Driven Design: implementing CQRS
Idiomatic Domain Driven Design: implementing CQRS
 
Architecting an ASP.NET MVC Solution
Architecting an ASP.NET MVC SolutionArchitecting an ASP.NET MVC Solution
Architecting an ASP.NET MVC Solution
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
 
ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
 
Build a LINQ-enabled Repository
Build a LINQ-enabled RepositoryBuild a LINQ-enabled Repository
Build a LINQ-enabled Repository
 
Layered Expression Trees: una terza via (idiomatica) verso il DDD
Layered Expression Trees: una terza via (idiomatica) verso il DDDLayered Expression Trees: una terza via (idiomatica) verso il DDD
Layered Expression Trees: una terza via (idiomatica) verso il DDD
 
From relational data to object spaces
From relational data to object spacesFrom relational data to object spaces
From relational data to object spaces
 
MVC2: non solo tecnologia
MVC2: non solo tecnologiaMVC2: non solo tecnologia
MVC2: non solo tecnologia
 

Dernier

Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 

Dernier (9)

Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 

Idiomatic Domain Driven Design

  • 1. Idiomatic Domain Driven Design Andrea Saltarello andreas@manageddesigns.it http://blogs.ugidotnet.org/pape http://twitter.com/andysal74 http://creativecommons.org/licenses/by-nc-nd/2.5/
  • 2. DDD Domain Driven Design: • è un approccio alla realizzazione del software pensato per contenere la complessità • Non è un silver bullet
  • 3. Ubiquitous Language E’ il linguaggio utilizzato nelle discussioni tra tutti i partecipanti al progetto, nei diagrammi, nella documentazione e nel codice, diventando così comune a tutti gli attori che partecipano alla realizzazione del software Attenzione ai dialetti!
  • 4. Ubiquitous Language: falsi positivi Nella sua definizione di segno linguistico, Ferdinand de Saussure distingue: • un elemento formale, o esterno, costituito dal significante, • e un elemento intrinseco, concettuale, costituito dal significato. Qualsiasi segno esiste solo grazie alla relazione tra significante e significato. In altre parole, il significante è la forma, fonica o grafica, utilizzata per richiamare l'immagine che, nella nostra mente, è associata a un determinato concetto, o significato.
  • 5. Bounded Context Un Bounded Context è un contesto all’interno del quale è valido uno specifico ubiquitous language Un sistema può quindi essere una composizione di contesti differenti (es: web store, accountability, delivery&shipment …), comunicanti tra di loro mediante una Context Map Ogni bounded context è (quasi) un sistema a sè
  • 7. Architettura di DDD è una layered architecture i layer Presentation e Infrastructure compaiono «per sport» nel diagramma i layer Application e Domain costituiscono quella che tipicamente chiamiamo «business logic» Domain: logica invariante per i casi d’uso Application: logica specifica ai casi d’uso
  • 9. Domain Layer: Key Concepts Il Domain Layer contiene la domain logic ed è composto da Model: Entità (identità e stato) e Valori (solo stato) Servizi Entità e Valori a runtime formano dei grafi di oggetti. I grafi dotati di “dignità propria” sono chiamati Aggregate e il sistema (es: i Repository) si “impegna” a gestirli correttamente ed atomicamente Le istanze di entità/aggregate sono costruite da Factory
  • 10. Domain Model: precisazioni Non stiamo modellando la realtà assoluta, bensì un modello funzionale all’interno di un bounded context
  • 11. Da 0 ad Aggregate E' un insieme di elementi raggruppati in un’unità logica, quindi un grafo di oggetti Ha come radice l'entità principale dell'aggregato La radice è l’unico elemento che può essere referenziato fuori dai confini dell’aggregato Non è possibile agire direttamente sugli elementi senza passare dalla radice dell'aggregato L’aggregate ha la responsabilità di implementare la propria logica
  • 13. Repository pattern Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects. Ricapitolando: • Interfaccia “collection like” • Gestisce la persistenza degli Aggregate • LINQ! (siamo dei buongustai )
  • 15. Repository++ Quisquilie IT: Code Contracts Repository <3 IoC
  • 17. Application Layer: in teoria Application Layer: defines the jobs the software is supposed to do and directs the expressive domain objects to work out problems. The tasks this layer is responsible for are meaningful to the business or necessary for interaction with the application layers of other systems. This layer is kept thin. It does not contain business rules or knowledge, but only coordinates tasks and delegates work to collaborations of domain objects in the next layer down. It does not have state reflecting the business situation, but it can have state that reflects the progress of a task for the user or the program.
  • 18. Application Layer: in pratica E’ un catalogo di servizi in grado di effettuare il mesh della logica presente nel domain layer esponendola alla applicazione (es: presentation layer) in una forma ad… alta digeribilità
  • 20. Presentation Layer vs. DDD Avere a disposizione un domain layer «smart» è bello, ma costoso: Materializzazione degli oggetti Mesh della business logic Tipicamente, si finisce per passare la vita a «fare DTO»: Domain Layer <-> Application Layer Application Layer <-> Presentation Layer
  • 21. MVC - Model View Controller Update state Set state Model View Change view Controller User action View e Controller conoscono Model Solo Controller agisce verso Model View è passiva Model è indipendente da View e Controller
  • 22. MVC: Falsi miti Lo scopo del Controller non è di separare la View dal Model. La responsabilità del Controller è di fare da mediatore tra l'utente e l'applicazione, non tra la View e il Model. Nella “web suburbia” si dice MVC, ma si intende Model 2 [JSP specs]
  • 23. Model 2 In a Model 2 application, requests from the client browser are passed to the controller, which is a servlet. The controller decides which view (JSP) it will pass the request to. The view then invokes methods in a JavaBean (which may access a database) and returns the Response object to the Web container, which is then passed on to the client browser. [Wikipedia] Legenda: • Servlet->HttpHandler->Front Controller [P of EAA, 344] • JSP->Controller->Page Controller [P of EAA, 333]
  • 24. MVC @ Managed Designs In bottega usiamo ASP.NET MVC dalle prime CTP della v1, ed abbiamo raggiunto una struttura «standardizzata» dei progetti: Model 3 Layered Expression Trees
  • 25. MVC goes Model 3 Model 2 separa il Controller in: Front Controller Page Controller Model 3 separa il Model in: View Model: rappresenta i dati che la view si impegna a presentare all’utente Worker Service: è la façade verso il Domain Layer che il page controller utilizza per produrre il View Model (Application Layer in DDD)
  • 26. Never mind the bollocks, here’s the Model 3
  • 27. Layered Expression Trees (LET idiom) Facciamo un gioco: invece di definire un «botto» di DTO, facciamo che layer e servizi si scambino degli IQueryable<YourFavouriteDomainEntity>, facendo «emergere» la query e specificando la proiezione solo all’ultimo momento? L’espressione «Capra e cavoli» vi dice niente? 
  • 28. C’mon Query LET’s go party (ah-ah-ah, yeah!)
  • 29. MVVM Presentation Model Represent the state and behavior of the presentation independently of the GUI controls used in the interface The Presentation Model coordinates with the domain layer and provides an interface to the view that minimizes decision making in the view.
  • 30. MVVM vs. DDD • WPF: il ViewModel può consumare il domain layer senza limitazioni • Silverlight: il ViewModel non ha accesso al model
  • 31. MVVM vs. Bottega51 • WPF: il ViewModel può consumare il domain layer senza limitazioni • Silverlight: il ViewModel non ha accesso al model
  • 32. Conclusioni DDD permette di «concepire» ed «organizzare» un sistema in modo efficace IQueryable<T> supporta DDD abbassando il costo della materializzazione degli oggetti ASP.NET MVC rocks!
  • 34. Cosa è l’Architettura? Secondo la definizione ISO/IEC 42010: “L’organizzazione basilare di un sistema, rappresentato dalle sue componenti, dalle relazioni che esistono tra di loro e con l’ambiente circostante, e dai principi che governano la sua progettazione e evoluzione."
  • 35. ISO/IEC 42010 fact sheet Titolo: IEEE Recommended Practice for Architectural Description of Software-Intensive Systems Scope: This recommended practice addresses the architectural description of software-intensive systems. A software- intensive system is any system where software contributes essential influences to the design, construction, deployment, and evolution of the system as a whole. architect: The person, team, or organization responsible for systems architecture. architecting: The activities of defining, documenting, maintaining, improving, and certifying properimplementation of an architecture. architecture: The fundamental organization of a system embodied in its components, their relationships to each other, and to the environment, and the principles guiding its design and evolution.
  • 36. Architettura: cosa? L’architettura di un sistema *è* definita durante la fase di progettazione. L’architettura *non è* parte dell’analisi: l’analisi si concentra su cosa debba fare il sistema La progettazione si concentra su come debba farlo
  • 37. Architetto: le responsabilità L’architetto: Recepisce i requisiti funzionali (emersi durante l’analisi) e quelli non funzionali (es: HA, scalabilità, security …) Suddivide i grandi sistemi in (layer di) sottosistemi individualmente assegnabili ad uno sviluppatore o ad un gruppo di lavoro Effettua una analisi del rapporto costi/benefici per determinare il miglior modo di soddisfare i requisiti, eventualmente ricorrendo a componenti commerciali o comunque già sviluppati Genera “specifiche”: sketch, modelli o prototipi per comunicare al gruppo di lavoro le modalità di realizzazione
  • 38. Architettura: luoghi comuni Architetto != Analista Architetto != Project Manager Architettura != Design Al limite… Design  Architettura
  • 39. Architettura: rappresentazione L’architettura si rappresenta mediante le view, che sono la rappresentazione del sistema osservato da un certo view point. Tutto fa brodo, ma ISO 19501 (UML) offre alcuni view point “significativi” espressi con una notazione *standard*
  • 40. Requisito: una definizione 1. Condizione o capacità che occorre all’utente per risolvere un problema o raggiungere un obiettivo 2. Condizione o capacità che deve essere raggiunta o posseduta dal sistema per soddisfare un contratto, standard, specifica o altro documento formale 3. La rappresentazione documentata di una condizione o capacità (1 o 2)
  • 41. Requisiti: la teoria La norma ISO9126, pubblicata nella sua prima versione nel 1991, ha definito il modello dei requisiti qualitativi del software. Secondo tale modello i requisiti sono raggruppabili in 6 "caratteristiche" e in 21 "sottocaratteristiche“, distinte fra caratteristiche esterne (orientate all’utente) e caratteristiche interne (orientate allo sviluppo e manutenzione).
  • 42. Funzionalità Capacità di soddisfare esigenze esplicite od implicite. Idoneità = funzionalità appropriate per specificati compiti Accuratezza = precisione dei risultati Interoperabilità = capacità di interagire con altre applicazioni Sicurezza = protezione da utilizzi non autorizzati Concordanza = aderenza a standard o regolamentazioni legislative
  • 43. Disponibilità Capacità di fornire una continuità di servizio Maturità = mancanza di interruzioni per malfunzionamenti Tolleranza = ridotto degrado in caso di malfunzionamenti Recupero = capacità e velocità di ripristino dopo interruzioni
  • 44. Usabilità Facilità di utilizzo da parte degli utenti Comprensione = acquisizione di adeguato livello di conoscenza Apprendimento = velocità di familiarizzazione Utilizzabilità = facilità di uso e controllo Attrattiva = livello di gradimento nell’utilizzo
  • 45. Efficienza Capacità di fornire prestazioni adeguate Tempo Risposta = reattività agli stimoli dell’utente Utilizzo risorse = utilizzo adeguato delle risorse del sistema
  • 46. Manutenibilità Facilità di manutenzione correttiva e evolutiva Analizzabilità = facilità di diagnosi e identificazione componenti Modificabilità = facilità di inserimento di modifiche Stabilità = limitazione di effetti indesiderati derivanti da modifiche Collaudabilità = facilità di testare le modifiche apportate
  • 47. Portabilità Trasferibilità da un ambiente all’altro Adattabilità = facilità di adeguamento ad un nuovo ambiente Installabilità = velocità e completezza di installazione Coesistenza = capacità di risiedere con altre applicazioni nello stesso ambiente Sostituibilità = capacità di rimpiazzare un’altra applicazione con simili funzionalità
  • 48. Recepire i requisiti La mancanza di requisiti o la mancanza della loro gestione sono tra le cause principali del fallimento dei progetti Recepire i requisiti significa circoscrivere il problema Strumenti utilizzati in bottega: • Use case • User story
  • 49. FINE