DDD e validazione
Andrea Canegrati
Grazie!
Agenda
• Cosa si intende per validazione
• Validazione nel “contesto” DDD
• Diverse tipologie di validazione
– Validazione invariante
– Validazione contestuale
• Tecniche di validazione a confronto
Un caso “reale”
Hotel-Reception System
(HRS) • Sistema di registrazione di nuovi ospiti presso un
hotel
• Per un ospite sono previsti i seguenti servizi:
– Assegnazione di una camera vuota
– Possibilità di posto auto presso una struttura
convenzionata
– Possibilità di usufruire del Kit di benvenuto se in
possesso della “Carta Vip”
Cosa si intende per
validazione?
“Significato” di
validazione • Processo atto a verificare che particolari
requisiti siano soddisfatti da uno specifico
elemento o da un insieme
• I requisiti sono caratteristiche proprie del
sistema che si sta considerando
• Obiettivo: mantenere l’integrità di un sistema!!
Validazione nel mondo
“DDD” • Particolari requisiti da soddisfare: Regole di
business legate al dominio
• Verifica dei requisiti per un elemento:
Applicazione di regole a entità, value object e
aggregati
Esempi di regole in HRS
• Un ospite per registrarsi deve fornire i propri dati
anagrafici:
–Nome
–Cognome
–Numero di documento
• Se in possesso della Carta Vip allora avrà accesso al
Kit di Benvenuto
Tipologie di validazione
Tutte le regole sono
sempre valide? • …dipende
• E’ possibile suddividere la validazione in due
macrocategorie:
– Validazione “invariante”
– Validazione “contestuale”
Validazione Invariante
• Vincoli che rappresentanto delle caratteristiche
proprie di un’entità o di un value object e fanno
parte del suo “comportamento”
• Deve sempre essere rispettata!!!
• Esempio in HRS:
–Un ospite DEVE avere nome, cognome e un
documento di identificazione
– Il numero di documento DEVE essere univoco
Validazione Contestutale
• Non comprende vincoli obbligatori
• Viene valutata solamente in determinate
situazioni legati a contesti o ad azioni specifiche
• Viene valutata ogni volta che si esegue l’azione o
si entra nel contesto
• Esempio in HRS:
–Un ospite potrà avere il Kit di Benvenuto all’arrivo
solo in possesso di una Carta Vip
Tecniche di validazione
“invariante”
Approccio “Always Valid”
• Verifica delle regole alla creazione
dell’entità/value object e ad ogni operazione
che può alterarne lo stato
• Conseguenze:
– Lo stato degli oggetti non è MAI inconsistente
– Quando gli elementi interagiscono tra di loro non è
necessario verificare nuovamente i vincoli invarianti
“Always Valid”: creazione
degli oggetti • La creazione delle entità/value object deve
impedire di ottenere delle istanze non valide
• Utilizzo di Factory o di Factory-Methods
“Always Valid”: operazioni
di modifica • Ogni operazione deve verificare i vincoli invarianti e
fallire nel caso in cui non vengano rispettati
• Evitare di utilizzare i “setters” per modificare i valori dell’entità/value object
• Ricorrere a metodi che rappresentano le operazioni espresse dall’ubiquitous language
Approccio “Valid on
demand” • Verifica delle regole effettuata alla chiamata di un
metodo di validazione che può appartenere alla classe oppure delegato ad un validatore “esterno”
• Conseguenze:
– DEVE sempre essere richiamata prima di ogni operazione che coinvolge l’elemento
Quale tecnica utilizzare?
• Essendo vincoli invarianti ha senso creare un oggetto senza che essi siano rispettati?
• Esempio in HRS:
– Può esistere un ospite senza documento?
– Ha senso modificare l’anagrafica di un ospite inserendo nome vuoto?
• L’entità/value object verrà validata prima di ogni operazione che la/lo coinvolge?
• Esempio in HRS:
– Verificare che l’ospite sia valido prima di effettuare la richiesta per il posto auto
• La risposta è...NO => ALWAYS VALID!!
Tecniche di validazione
“contestuale”
Implementazione
validazione contestuale • Consiste nella valutazione di condizioni in un
contesto specifico
• Esempio in HRS:
– Se un ospite ha la Carta Vip è un ospite Vip ed ha diritto a servizi speciali (Kit di Benvenuto)
• In pratica: Specification
DEMO SLIDE
HRS in Action!
Che la validazione sia con
voi!
Grazie a tutti!!
I miei riferimenti:
• Email: [email protected]
• Blog: http://blogs.ugidotnet.org/darthdog/
Top Related