Domain Driven Design: Overview
Speaker: Giancarlo Sudano
About me:
Giancarlo Sudano (alias janky)
Software Architect in Objectway
Fondatore di GUISA
www.guisa.org
Blog su Ugidotnet:
http://blogs.ugidotnet.org/janky
Email:
[email protected]
[email protected]
Agenda
•
•
•
•
•
Domain Model
Domain Driven Design
Conceptual Map
Layering
Esempi reali: Web Client Software Factory
DOMAIN MODEL
Un po di discipline...
Business Requirement
Business Requirement
Use Case Model
Processo di
vendita
Processo
d’Ordine
(testo)
(testo)
Business Modeling
Business Requirement
Use Case Model
Processo di
vendita
Business Modeling
Domain Model
Processo
d’Ordine
Order
1..*
(testo)
(testo)
1..*
Product
Gli Use case, i termini, i
concetti ispirano il
Domain Model
1
Custome
r
Software Design
Business Modeling
Software Design
Domain Model
Order
Object Model
1
Custome
r
1..*
1..*
Product
I concetti del Dominio
ispirano nomi e
comportamenti delle classi
del software
Design del Domain Layer
Classificazione fatta da Fowler [PoEAA 2004]
Transaction Script:
Principalmente il layer sarà modellato con delle procedure che prendono
l’input dal layer di presentation, li processano e eventualmente trasmettono
manipolazioni sui database.
Table Module:
Serie di classi che gestiscono la logica di business
per tutte le righe sul database di una particolare entità.
Domain Model:
Serie di classi ispirate al modello analitico che gestiscono
sia stato che comportamento. Una singola istanza rappresenta una singola entità.
Riepilogo delle definizioni
• Modello analitico: concettualizzazione del problema di
business
• Domain Layer: Strato di software che rappresenta
l’implementazione del modello analitico
• Domain Layer patterns: metodologie per implementare i
problemi di business
– Transaction script
– Table Module
– Domain Model
DOMAIN DRIVEN DESIGN
...tutto cominciò...
• Formalizzazione fatta da Eric Evans 2003/04 nel
suo libro
“Domain Driven Design:
Tackling Complexity In The Heart Of Software”
• Scopo del libro:
– “…To describe and build a vocabulary about the very art
of domain modeling…”
Domain Driven Design: Il portale
• http://domaindrivendesign.org
–
–
–
–
–
–
Informazioni
Interviste
Articoli
Discussioni
Case Stories
Esempi
Domain Driven Design: Definizione
 La DDD è un mindset, cioè una serie di principi e
priorità, atte ad accelerare la progettazione software
che ha a che fare con domini di particolare
complessità.
Presupposti per la nascita di DDD
• Il modello analitico (cioè il risultato del lavoro degli
analisti) è uno strumento di sola comprensione.
• Un analista poi può usare UML per la visualizzazione del
modello stesso.
• Il modello non porterà nessun dettaglio implementativo
ai fini di non inquinare la comprensione.
Quindi...
• l'implementazione di un modello molte volte può
allontanarsi notevolmente dalla sua iniziale descrizione.
• La Domain Driven Design è una disciplina di
progettazione atta quindi a tenere costantemente
vicini/connessi il modello analitico che il modello
implementativo.
Esempio classico di discostamento
La prima Conceptual Map di DDD
Entity e ValueObject
Entity
Value Object
Semantica
Semantica di Reference:
Una Fattura, un Ordine, un Cliente
Semantica di Valore:
Un Indirizzo, una Coordinata 3D, un
Numero Complesso
Life cycle
Indipendente
Coincidente con l’oggetto a cui
appartiene
Uso
Una Entity tende a memorizzare uno
stato, esporre comportamenti e
coordinare altre entity/value object
associati
Un value object tende a memorizzare
uno stato
Uguaglianza
Basata sull’identità.
Cioè dal confronto di uno (o più)
attributi specifici che la
rappresentano univocamente.
Basata sul confronto di tutti i suoi
attributi.
Rappresentazione nel
modello Object
Oriented
Una Classe
Una Classe (o uno Struct)
Rappresentazione nel
modello relazionale
Una (o più) tabelle
Una (o più) colonne di una tabella
Troppa logica nelle entity?
In generale si tende ad aggiungere solo i metodi
essenziali ad una entity.
Inserire troppa logica all’interno di una entity:
+ Complessità
- Manutenibilità
- Chiarezza, Espressività
Service
Una classe Service modella, non tanto una entità di dominio,
ma una regola di business
Qualcosa che il software “deve fare” (operazione) e che non
necessariamente coincide con uno stato
Business Rules
Restrictions:
Un cliente non può inserire più di tre richieste d’ordine caricate sul suo credit account.
Heuristics:
Gli ordini di un cliente con uno stato preferenziale verranno evasi immediatamente.
Computations:
Il volume di ordini annuale di un cliente deve essere calcolato dal totale delle vendite chiuse entro la
chiusura dell’anno fiscale aziendale.
Inference:
Un cliente deve essere considerato preferenziale se ha almeno 5 ordini superiori a 1000 euro.
Timing:
Un cliente verrà archiviato se non effettua ordini per 36 mesi consecutivi.
Triggers:
Quando un ordine è stato spedito, una notifica di “Send advance” deve essere notificata ad una serie di
sottoscritti
Tipi di Services
Tipologie di Servizi
Esempi
Infrastrutturali
•Spedizione di una Mail
•Persistenza di una entity in uno storage
•Tracciamento delle operazioni di una
Entity
Applicativi (o di
dominio)
•Trasferimento di valuta tra conti bancari
•Approvazione di un Ordine d’acquisto
•Validazione di Entity a fronte di una
operazione di business
Come distribuire logica tra
Service e Entity?
Una Entity con troppe responsabilità rischia di perdere in
chiarezza concettuale.
Entity troppo cariche sono di difficile manutenzione,
refactoring e testing.
Le operazioni di business, sono spesso legate ad altre
entity. Esprimere queste operazioni come metodo di una
Entity, aumenta la sua dipendenza da altri oggetti
Service dipendenti da classi
(non da id)
Factory
Responsabilità di creare e assemblare oggetti
particolarmente complessi.
La logica di creazione di grafi immersa nel costruttore
stesso, potrebbe non essere una “buona idea”.
Repository
Responsabilità del ciclo di vita delle Entity.
Responsabilità infrastrutturali di persistenza quali Identity
Map, Cache.
LAYERING
Contesto classico
• Isolare il codice dalla interfaccia utente
• Isolare il codice di accesso al database
Soluzione classica
Presentation
Business Logic
Data Access
Soluzione classica
WinForm
Compact
Framework
Web Form
Business Logic
Data Access
(database A)
Data Access
(database B)
WPF Form
Non se ne può più...andiamo
oltre 
Requisiti più alti
•
Dominio
–
–
–
•
Presentation Layer
–
–
•
Domain Model quanto più indipendente da tutte le altre parti del sistema.
E’ buona norma rendere il DM facilmente testabile, modificabile.
Minimizzare la dipendenza anche dalle API di .NET.
Riutilizzo più pesante del codice tra una Presentation Layer ed un altro
Migliorare le capacità di Test delle View e della logica di Flusso
Servizi:
–
Distinzione tra servizi infrastrutturali e applicativi
Isolamento: Layering
User Interface (Presentation Layer)
Responsible for presenting information to the user and
interpreting user commands.
Application Layer
This is a thin layer which coordinates the application
activity. It does not contain business logic. It does not
hold the state of the business objects, but it can hold
the state of an application task progress.
Domain Layer
This layer contains information about the domain. This
is the heart of the business software. The state of
business objects is held here. Persistence of the
business objects and possibly their state is delegated to
the infrastructure layer.
Infrastructure Layer
This layer acts as a supporting library for all the other
layers. It provides communication between layers,
implements persistence for business objects, contains
supporting libraries for the user interface layer, etc.
Soluzione
Presentation
UI Process
Business Logic
Data Access
Coordina le attività
dell’applicazione.
Non contiene logica di
business.
Non gestisce lo stato delle
Entity, ma gestisce lo stato
dell’applicazione e dei
progresso dei task
Può eseguire Processi di
Business e Servizi in
seguito a comandi dalla UI
o a Eventi Esterni
Confusioni sui nomi di layer?
DNA, J2EE
Brown
Martin Fowler
Eric Evans
Presentation
=
Presentation
Presentation
Presentation
Presentation
UI Process
=
...
Controller/
Mediator
Application
Controller
Application
Business
=
Business
Domain
Domain
Domain
Data Access
=
Data Access
Data Access
Data Source
Infrastructure
Soluzione
Presentation
UI Process
Business Process
Security Service
Business Rules
Validations
Data Access
Entity (detto anche Core)
Altri Service
Soluzione
Presentation
UI Process
Business Process
Security Service
Business Rules
Validations
Data Access
Entity (detto anche Core)
Altri Service
Layered Applications
Service Gateway
CrossCutting Utility Class
Exception Handling, Logging, Security
Presentation Layer
UserInterface Process Layer
Workflow Foundation, BizTalk,
Spring Validation, Validation Application Block
DataAccess Layer
Service Layer
Dependency Injection Framework
ORM
(Spring.NET, Windsor)
NHibernate, Linq to SQL, Genome
Legacy
WebServices
Domain Layer
LDAP
EnterpriseServices
Database
AOP Framework
Business Process Layer
Spring.net, Policy Injection Application Block
Authorization
CAB , CWAB, Acropolis ,
MonoRail, Workflow Foundation
Authentication
Log e Trace
Transaction
Management
ALTRE NAVIGATION MAPS
Supple Design Patterns
Eric Evans: Domain Driven Design [2006]
Model Integrity Patterns
Eric Evans: Domain Driven Design [2006]
Riferimenti
• Libro: Domain Driven Design: Tackling Complexity In The
Heart Of Software
[Eric Evans 2003]
• Libro: Applying Domain-Driven Design and Patterns
[Jimmy Nilsson 2006]
• Libro: Domain Driven Design Quickly
[InfoQ 2006] (gratuito, scaricabile da internet)
• http://domaindrivendesign.org/
• Seguite il mio blog:
iniziativa: “Domain Model e Enterprise Application”
Scarica

Domain Model