我倾向于使用变量来提高可读性但是当谈到monad时,我提出了我自己的约定,以明确我的变量包含在(可能是堆栈)monad(s)中
def getUser(id: Int): Future[User] = ???
val _user1 = getUser(1)
val _user2 = getUser(2)
for {
user1 <- _user1
user2 <- _user2
} yield (user1, user2)
我的一些同事倾向于选择这种语法:
val fUser1 = getUser(1) // makes it clear user is wrapped in a Future
但我相信这可能容易出错:
// getUser now returns an option
def getUser(id: Int): Option[User]
val fUser1 = getUser(1) // still compiles but is misleading
// same, if getUser returns a Future[Either[String, User]]
val fUser1 = getUser(1) // fUser1 looks like a Future[User] to me
我认为用_作前缀变量是最差的解决方案,但也不理想......你有解决方案吗?
答案 0 :(得分:3)
我认为表示您的价值被包装的下划线前缀是非常规的,因此不太可能对其他读者有所帮助。
下划线前缀通常用于表示字段,例如在C#中,请参阅Naming Conventions in C# - underscores
对于期货,使用“f”前缀是Hungarian Notation,并且如果过时则至少被广泛理解。
如果您认为有必要强调类型,我会考虑使用后缀,例如userFuture
,否则我只会使用user
。
如果您认为有必要,您还可以使用类型注释来阐明类型,例如: val user: Future[User] = getUser(1)
你说:
但我相信这可能容易出错:
// getUser now returns an option def getUser(id: Int): Option[User] val fUser1 = getUser(1) // still compiles but is misleading
您将找不到编译器强制执行的命名约定,因此这种关注将适用于您选择的任何命名约定。