正如标题所提到的,使用这样的数据结构有意义吗?我来一一解释一下:
- Future - 代表异步计算
- 要么 - 传达已知错误
- 选项 - 传达该值可能不存在
看到这个的时候我有点害怕。使用这种类型组合是一个好的做法吗?
让我们看一下解决方案空间:
Success(Right(Some(user))) => Everythig OK, got an user
Success(Right(None)) => Everything OK, no user
Success(Left(AppError)) => Something went wrong at app level
Failure(Exception) => Something went wrong
这看起来很有表现力,但是当您尝试与其他调用组合这样的嵌套结构时,事情很快就会变得丑陋(请参阅将阻塞代码转换为使用 scala futures https://stackoverflow.com/questions/40161024/converting-blocking-code-to-using-scala-futures/40161838#40161838) 的组合示例Future[Option[T]]
)
所以以下最小功率原则 http://www.lihaoyi.com/post/StrategicScalaStylePrincipleofLeastPower.html,
我们问自己:是否有保留语义的不太复杂的替代方案?
有人可能会争辩说Future[User]
如果我们充分利用异常(和异常层次结构)的潜力就足够了。
让我们检查:
Everythig OK, got an user => Success(user)
Everything OK, no user => Failure(UserNotFoundException) (Application level exception)
Something went wrong at app level => Failure(AppException) (Application level exception)
Something went wrong => Failure(Exception) (System-level exception)
这种方法的唯一限制是 API 的用户需要了解异常情况,而这些异常情况并未在界面中自行记录。优势在于拥有一个基于Future
s 将允许与其他的富有表现力的单子组合Future
基于 API。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)