Assumiamo un oggetto costruito utilizzando un modello di builder.Il modo migliore per gestire la convalida dei campi dell'oggetto => O/Prova (scala 2.10)/ValidationNEL (scalaz)
Questo modello di builder conterrà un metodo build
che si concentra sulla convalida dei campi e quindi sulla conversione nel tipo di destinazione.
La convalida potrebbe essere implementato usando:
Either[FailureObject, TargetObject]
tipoTry[TargetObject]
(nuova funzione da Scala 2.10)Validation[FailureObject, TargetObject]
oValidationNEL[FailureObject, TargetObject]
dalla libreria scalaz
ho letto che uno dei i principali vantaggi del tipo Validation
su è quello Validation
può accumulare guasti "out of the box".
Ma che dire del "nuovo" modo Try
? Ho notato che Try
dispone anche di metodi "monadici", come map
, flatMap
ecc., Cosa mancava davvero in entrambi i casi senza l'aiuto di Projection
.
Pertanto, immagino che ciascun metodo di convalida dei campi restituisca un valore Try[FieldType]
e, più precisamente, in caso di errore, uno Try[SpecificFieldExceptionType]
; questo campo nidificato contenente un campo di messaggio String
e un campo rootCause che è possibile accumulare in tutto il metodo build
.
Utilizzare Scala 2.10, potrebbe o dovrebbe Try
sostituire la libreria di convalida scalaz per la convalida semplice come il modello di builder comporta?
** EDIT * ***
Leggendo Try
codice sorgente, suona che Try
non possono accumulare diverse eccezioni e quindi è orientato fail-fast. Anche Try.flatMap
restituisce il potentential fallimento precedente e quindi non ha il concetto di accumulo:
def flatMap[U](f: T => Try[U]): Try[U] = this.asInstanceOf[Try[U]]
Al contrario di ValidationNEL
che gestisce funzione di accumulo.
Qualche conferma?
Impossibile immaginare una risposta migliore => molto ben spiegato! Grazie mille :) Effettivamente, ho scelto Validation per lavorare con il mio Builder. – Mik378
@ Mik378 grazie! – mergeconflict