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