我了解 Some/None/Option 背后的整个原理和概念,我当然可以欣赏它的优点。我的问题更多的是最佳实践。它什么时候会变得矫枉过正,什么时候虔诚地使用它才有意义。我认为(我可能是错的)但尽可能多地使用它是有意义的,因为它是一种更安全的方式来传递任何东西(而不是 null)。我看到自己经常做的事情是让一些函数散布着 map、getOrElse、get、match 甚至有时嵌套它们,这往往看起来很难看。是否有一些我遗漏的概念或一些与接收多个可选值的函数有关的最佳实践。例如:
def updateJobs(id: Int) = withAuth {
request => {
User.userWithToken(request.headers.get("token").get).map {
user =>
Job.jobsAfterIdForForeman(id.toString, user.id.toString) match {
case Some(json) => Ok(json)
case _ => NoContent
}
}.getOrElse(BadRequest)
}
}
甚至更糟,例如:
def addPurchaseRequest(json: JsValue) = {
(json \ "jobId").asOpt[Long].map {
jobId => JobDAO.jobWithId(jobId).map {
job => PurchaseRequestDAO.insert(new PurchaseRequest(json, job)).map {
model =>
val request = model.asInstanceOf[PurchaseRequest]
(json \ "items").asOpt[List[JsObject]].map {
list => {
if (PurchaseItemAssociationDAO.bulkInsert(PurchaseItemAssociation.itemsFromJsonArray(list, request.id))) Option(request.addResponseJson) else None
}
}.getOrElse(None)
}.getOrElse(None)
}.getOrElse(None)
}.getOrElse(None)
}
我设法重构了一些看起来不那么疯狂,但是有没有更好的方法来重构它,让它看起来不那么疯狂?我是不是错过了什么,或者你已经习惯了看起来像这样的东西?似乎肯定应该有更清洁的做法。