【问题标题】:Choosing a proper return type for a function returning a map of errors为返回错误映射的函数选择正确的返回类型
【发布时间】:2014-02-11 16:17:06
【问题描述】:

我有一个函数应该返回Map[String, Seq[String]] 作为键的错误序列(以防出现错误)或返回成功(可能是Unit)。我想知道,它的最佳返回类型是什么?

def foo1(a: Int): Map[String, Seq[String]]
def foo2(a: Int): Option[Map[String, Seq[String]]]
def foo3(a: Int): Either[Map[String, Seq[String]], ???]
//def foo4(a: Int): something else?

如果是第一种情况,如果没有错误,它必须返回Map["", Seq()],而且在我看来,它看起来并不优雅。在第二种情况下,它将返回None,这没关系,但它似乎是多余的。第三种情况也是如此,但还有一个问题 - 我将返回 Right 什么?

你怎么看?

【问题讨论】:

  • 在我看来,这主要是基于意见的问题。所以这是我的意见:它应该命名为getErrors(或类似名称)以强调结果是结果类型为Option[...] 的错误的集合,或者你应该使用scalaz.Validation 作为结果类型:Validation[Map[String, Seq[String]], Unit] 或@987654331 @.
  • @senia 在客户端检查 map.isEmpty 不是更好吗?
  • @senia 你认为 return Option[Map[String, Seq[String]]] 是否合理?为什么不只是 Map[String, Seq[String]]?
  • 我想这里最好的解决方案是Validation:def validateFoo(a: Foo): ValidationNEL[ErrorType, Foo]。使用自定义ErrorType
  • @senia,但我没有使用 scalaz。

标签: scala


【解决方案1】:

第一个选项的唯一问题是很容易忘记在返回结果上检查isEmpty。如果大多数客户自然会用空地图做正确的事情(例如,因为他们只是迭代它,或者得到错误的数量),这是最好的。如果您将方法命名为 getErrors(如 @senia 所说),选项 2 是可以接受的,选项 3 也是可以的(使用 Either[Map[String, Seq[String]], Unit])。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多