让我们假设一个使用构建器模式构造的对象。
这个构建器模式将包含一个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]
;这个嵌套的包含一个String
message 字段和 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(使用前将#替换为@)