Лучший способ обработать валидацию полей объекта => Either / Try (scala 2.10) / ValidationNEL (scalaz)
Давайте предположим, что объект построен с использованием шаблона построителя.
Этот шаблон строителя будет содержатьbuild
метод, сосредоточенный на проверке полей, а затем на преобразовании в целевой тип.
Эта проверка может быть реализована с использованием:
Either[FailureObject, TargetObject]
типTry[TargetObject]
(новая функция из Scala 2.10)Validation[FailureObject, TargetObject]
или жеValidationNEL[FailureObject, TargetObject]
из библиотеки скалазаЯ прочитал, что одно из главных преимуществValidation
надEither
типа этоValidation
может накапливать сбои "из коробки".
А как же "новый"Try
путь? Я заметил, чтоTry
имеет "монадические" методы из коробки также, какmap
, flatMap
и т. д. ... чего действительно не хватало в любом типе без помощиProjection
.
Таким образом, я представляю, что каждый метод проверки поля возвращаетTry[FieldType]
а точнее, в случае любого сбоя,Try[SpecificFieldExceptionType]
; этот вложенный, содержащийString
поле сообщения и поле rootCause, которое может быть накоплено на протяженииbuild
метод.
Используя Scala 2.10, можно или нужноTry
Практика заменить библиотеку проверки скаляза для простой проверки, как в случае с шаблоном компоновщика?
**РЕДАКТИРОВАТЬ****
ЧтениемTry
Исходный код, звучит так, чтоTry
не может накапливать несколько исключений и поэтому ориентирован на отказоустойчивость. ЧетныйTry.flatMap
возвращает потенциальный предыдущий сбой и поэтому не имеет понятия накопления:
def flatMap[U](f: T => Try[U]): Try[U] = this.asInstanceOf[Try[U]]
НаоборотValidationNEL
это обрабатывает функцию накопления.
Любое подтверждение?