我在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风格确定一个完美的模式,你有时会得到一个实体,有时却没有,有时候只有一个列表。有没有“最好的”方法,或者每个人都有自己的角色?
答案 0 :(得分:15)
返回类型应该有助于澄清API的预期行为。
如果GetUser
返回List
,开发人员可能会感到困惑,并想知道是否可能会返回多个用户。当他们看到返回Option
时,他们会立即理解预期的行为。
我曾经不得不使用一个相当复杂的API,它提供了以你描述的方式推广的CRUD操作。我发现它很难理解,含糊不清,难以使用。
答案 1 :(得分:1)
在我看来,这是一个非常好的API设计模式。
我经常使用Option
作为我的函数的返回类型,如果我想返回单个元素,显然是因为我不需要处理null
。对于多个元素,返回Seq
自然是最佳的,如果要返回失败描述,Either
是最佳的,我在解析I / O时经常使用它。有时我甚至将Seq
与其他人合并。您可能不了解API用户的偏好和目标,因此可以提供所有这些返回类型,以使用户感觉尽可能舒适。