gpt4 book ai didi

oop - 从具有 Id 的数据库中获取对象时,是否使用 Option 作为结果?

转载 作者:行者123 更新时间:2023-12-01 10:57:02 24 4
gpt4 key购买 nike

我做了一个从数据库中获取用户的定义。

 def user(userId: Int) : User = database withSession {
(for{
u <- Users if u.id === userId}
yield u).first
}

如果与不存在的 userId 一起使用,数据库可能会返回一个空列表。
但是我看不到何时会提供不存在的 userId。例如,我的 userId 是从登录用户中获取的。如果提供了一个不存在的 userId,那么我认为让请求失败是可以的。

有什么想法吗?

最佳答案

不,让请求失败是不行的:

def user(userId: Int) : Option[User] // is OK
def user(userId: Int) : Either[String,User] // is OK
def user(usedId: Int) : User // is not OK

否则您可以创建一个类型(一个概念)来封装一个 Integer,以确保它是一个有效的 UserId(在出生时)。

sealed case class UserId(u:Int) //extends AnyVal // If it's scala 2.10.0

object UserId {
def get(i:Int) : Option[UserId] = //some validation

} /// ....

def user(userId:UserId) : User //is OK // well it depends on the semantic of user destruction.

当您创建 def 时,您必须确保函数的域(this 和 args)与代码域(结果)之间存在适当的关系。

无论如何,不​​要犹豫,输入(创建概念),它会帮助您推理您的代码。


为什么 def user(userId: Int) :User 不正常?

因为 Integer 的元素与 User 的元素之间不存在关系。如果 UserIds 都是正整数,但你要求 user(-10) 怎么办? (这不会发生,对吧?)这个调用应该引发异常吗?还是返回 null ?

如果你认为它应该返回null,那么返回一个Option,它封装了可能丢失的对应关系。

如果您认为它应该引发异常,则返回:

  • Validation[SomethingRepresentingAnError, User] (scalaz),
  • Either[SomethingRepresentingAnError, User](scala 2.7、2.8、2.9)
  • Try[User] (斯卡拉 2.10)

拥有丰富的返回类型将有助于您正确使用 API。

顺便说一句,Scala 不使用检查异常,因此您不能使用异常作为替代结果。对于真正异常的行为(如运行时异常),应该保留异常。

另见:

  • http://www.scala-lang.org/api/current/index.html#scala.util.control.Exception$

关于oop - 从具有 Id 的数据库中获取对象时,是否使用 Option 作为结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14589315/

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