私は、Some/None/Option の背後にある原則と概念全体を理解しており、そのメリットを確かに理解できます。私の質問は、よりベストプラクティスです。いつそれが過剰になり、いつそれを宗教的に使用することが理にかなっていますか. 私はそう思います (そして私は間違っている可能性があります) が、(null とは対照的に) 何も渡さない方が安全な方法であるため、可能な限り使用することは理にかなっています。私がよくやっていると思うのは、map、getOrElse、get、match が散らばっているいくつかの関数を持っていることです。私が見逃している概念や、複数の Optional 値を受け取る関数を使用するためのベスト プラクティスはありますか。例えば:
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)
}
クレイジーに見えないようにいくつかをリファクタリングすることができましたが、これをリファクタリングしてそれほどクレイジーに見えないようにするより良い方法はありますか? 私は何かを見逃していますか、それともこのように見えるだけのものに慣れていますか? 確かに、よりクリーンなプラクティスが必要なようです。