处理对象字段验证的最佳方法 => Either / Try (scala 2.10) / ValidationNEL (scalaz)

2024-01-12

让我们假设一个使用构建器模式构造的对象。

这个构建器模式将包含一个build方法侧重于字段验证,然后转换为目标类型。

该验证可以使用以下方式实现:

  • Either[FailureObject, TargetObject] type
  • Try[TargetObject](Scala 2.10 的新功能)
  • Validation[FailureObject, TargetObject] or ValidationNEL[FailureObject, TargetObject]来自斯卡拉兹图书馆

我读到的主要优点之一Validation over Either类型是Validation可以“开箱即用”累积故障。

但“新”呢?Try方式?我注意到Try也有开箱即用的“monadic”方法,比如map, flatMap等等......在没有帮助的情况下,任一类型真正缺少什么Projection.

因此,我想象每个字段验证方法都会返回一个Try[FieldType]更准确地说,如果发生任何故障,Try[SpecificFieldExceptionType];这个嵌套的包含一个Stringmessage 字段和 rootCause 字段可以在整个过程中累积build method.

使用 Scala 2.10,可以或应该Try练习替换 scalaz 验证库以进行简单验证,例如构建器模式涉及的内容?

**EDIT ****


有一些权衡:

  • scalaz.Validation能够累积类型错误E给定一个Semigroup[E]实例。它的目的是用作Applicative, like:

    (fragileFoo |@| fragileBar) { case (foo, bar) => doSomething(foo, bar) }
    

    它确实有map and flatMap方法,偏向于Success侧,因此您可以方便地在for-理解。然而,没有Monad为其定义的实例,因此它不能用于任何高阶内容(例如,不能将它与 monad 转换器一起使用)。不过,这个缺点对你来说似乎并不构成问题。

  • scalaz.\/,你没有提到,确实形成了Monad(再次偏向于Right边)。但当用作Applicative,它不会累积失败Validation does.

  • util.Try类似于scalaz.\/,专门针对Throwable。尽管它同样缺乏错误累积,但它确实具有错误恢复的概念。但是,对于您的“构建器模式”用例,这似乎可能不是很有用。

  • 最后,util.Either与其他三个选项相比,不值得考虑:因为它不偏向某一方或另一方,所以您必须明确且一致地要求left or right每次你想做一些单一的事情时都会进行投影。

我最好的猜测是,对于你的情况,scalaz.Validation是最合适的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理对象字段验证的最佳方法 => Either / Try (scala 2.10) / ValidationNEL (scalaz) 的相关文章

随机推荐