Załóżmy obiekt skonstruowany przy użyciu wzorca budowniczego.Najlepszy sposób na sprawdzanie poprawności pól obiektu => Albo/Try (scala 2.10)/ValidationNEL (scalaz)
Ten wzorzec budowniczy zawierałby metodę build
skupiającą się na walidacji pól, a następnie na konwersji na typ docelowy.
Walidacja ta może być realizowana za pomocą:
Either[FailureObject, TargetObject]
typeTry[TargetObject]
(nową funkcję od Scala 2.10)Validation[FailureObject, TargetObject]
lubValidationNEL[FailureObject, TargetObject]
z biblioteki scalaz
czytałem, że jeden z głównymi zaletami Validation
w stosunku do typu Either
jest to, że Validation
może akumulować awarie "po wyjęciu z pudełka".
Ale co z "nowym" sposobem na Try
? Zauważyłem, że Try
ma również "monadyczne" metody, takie jak: map
, flatMap
itp ... tego, czego naprawdę brakowało w każdym typie bez pomocy Projection
.
Tak więc, wyobrażam sobie, że każda metoda walidacji pola zwraca Try[FieldType]
, a dokładniej, w przypadku jakiejkolwiek awarii, Try[SpecificFieldExceptionType]
; to pole zagnieżdżone zawierające pole komunikatu String
i pole rootCause, które może być nagromadzone w metodzie build
.
Korzystanie z Scala 2.10, może lub powinno być Try
Praktyka zastąpić biblioteki sprawdzania poprawności skalaz do prostego sprawdzania poprawności, jak wzór konstruktora obejmuje?
** EDIT * ***
Czytając Try
kodu źródłowego, to brzmi, że Try
nie mogą gromadzić liczne wyjątki, a zatem nie jest zorientowany szybki. Nawet Try.flatMap
zwraca potentential poprzednią porażkę i tak nie mają pojęcia Akumulacja:
def flatMap[U](f: T => Try[U]): Try[U] = this.asInstanceOf[Try[U]]
przeciwnie do ValidationNEL
, który obsługuje funkcję akumulacji.
Jakieś potwierdzenie?
Nie można sobie wyobrazić lepszej odpowiedzi => bardzo dobrze wyjaśnione! Wielkie dzięki :) Rzeczywiście, wybrałem walidację do pracy z moim konstruktorem. – Mik378
@ Mik378 dziękuję! – mergeconflict