gpt4 book ai didi

scala - 处理对象字段验证的最佳方法=>要么/试试(scala 2.10)/ValidationNEL(scalaz)

转载 作者:行者123 更新时间:2023-12-04 13:51:51 28 4
gpt4 key购买 nike

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

该构建器模式将包含build方法,该方法专注于字段验证,然后转换为目标类型。

可以使用以下方法实现此验证:

  • Either[FailureObject, TargetObject]类型
  • Try[TargetObject](Scala 2.10的新功能)
  • 来自scalaz库的
  • Validation[FailureObject, TargetObject]ValidationNEL[FailureObject, TargetObject]
    我读到Validation相对Either类型的主要优点之一是Validation可以“开箱即用”地累积故障。

    但是“新的” Try方式又如何呢?我注意到Try也具有开箱即用的“monadic”方法,例如mapflatMap等...在没有Projection的帮助下,这两种类型实际上都缺少什么。

    因此,我可以想象每种字段验证方法都返回一个Try[FieldType],更确切地说,如果出现任何失败,则返回一个Try[SpecificFieldExceptionType];这个嵌套的字段包含一个String消息字段和一个rootCause字段,这些字段可以在整个build方法中累积。

    使用Scala 2.10,Try做法可以还是应该代替scalaz验证库来进行简单的验证(例如构建器模式)?

    ** EDIT ****

    通过阅读Try源代码,听起来Try不能累积多个异常,因此面向快速失败。
    甚至Try.flatMap也会返回先前的潜在故障,因此没有累积的概念:
    def flatMap[U](f: T => Try[U]): Try[U] = this.asInstanceOf[Try[U]]

    与处理累积功能的ValidationNEL相反。

    任何确认吗?

  • 最佳答案

    需要权衡:

  • scalaz.Validation能够累积给定E实例的Semigroup[E]类型的错误。它旨在用作Applicative,例如:
    (fragileFoo |@| fragileBar) { case (foo, bar) => doSomething(foo, bar) }

    它确实具有mapflatMap方法,偏向Success一侧,因此您可以在for -comprehension中方便地使用它。但是,没有为它定义Monad实例,因此它不能在任何更高阶的东西中使用(例如,您不能将其与monad转换器一起使用)。不过,这种缺点似乎对您来说不是问题。
  • 您没有提到的
  • scalaz.\/确实形成了Monad(再次偏向Right一侧)。但是当用作Applicative时,它不会像Validation那样累积失败。
  • util.Tryscalaz.\/相似,专门用于Throwable。尽管它再次缺少错误累积,但确实具有错误恢复的概念。但是,对于您的“构建器模式”用例,这似乎并不是非常有用。
  • 最后,与其他三个选项相比,util.Either不值得考虑:由于它不偏向一侧或另一侧,因此您每次想进行单声道操作时,都必须明确且始终如一地要求leftright投影。

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

    关于scala - 处理对象字段验证的最佳方法=>要么/试试(scala 2.10)/ValidationNEL(scalaz),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15119821/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com