这是设计Scala API的良好返回类型模式吗?

时间:2012-08-07 01:00:54

标签: scala

我在Scala中经常看到这种类型的模式(found this example here):

class UserActor extends Actor {
  def receive = {
    case GetUser(id) =>
      // load the user, reply with None or Some(user)
      val user: Option[User] = ... 
      sender ! user
    case FindAll() =>
      // find all users
      val users: List[User] = ...
      sender ! users
    case Save(user) =>
      // persist the user
      sender ! Right(user)
  }
}

因此,取决于你得到的电话:选项[用户],列表[用户],右[用户]。这种方法很好!如果这是最佳的,我只是想问一下它的兴趣?例如(这可能是一个糟糕的):通过总是返回List [User]来尝试和推广它会使API变得更好或更糟吗?因此,当找不到用户或保存失败时,列表将只是空的。我只是好奇......关于如何改进上述'模式'的任何其他建议?

我只是想为这种API风格确定一个完美的模式,你有时会得到一个实体,有时却没有,有时候只有一个列表。有没有“最好的”方法,或者每个人都有自己的角色?

2 个答案:

答案 0 :(得分:15)

返回类型应该有助于澄清API的预期行为。

如果GetUser返回List,开发人员可能会感到困惑,并想知道是否可能会返回多个用户。当他们看到返回Option时,他们会立即理解预期的行为。

我曾经不得不使用一个相当复杂的API,它提供了以你描述的方式推广的CRUD操作。我发现它很难理解,含糊不清,难以使用。

答案 1 :(得分:1)

在我看来,这是一个非常好的API设计模式。
我经常使用Option作为我的函数的返回类型,如果我想返回单个元素,显然是因为我不需要处理null。对于多个元素,返回Seq自然是最佳的,如果要返回失败描述,Either是最佳的,我在解析I / O时经常使用它。有时我甚至将Seq与其他人合并。您可能不了解API用户的偏好和目标,因此可以提供所有这些返回类型,以使用户感觉尽可能舒适。