下面是一個很常見的遊戲框架2控制器:階:改善這段代碼的可讀性和風格
def save(ideaId : Long) = CORSAction { request =>
Idea.findById(ideaId).map { idea =>
request.body.asJson.map { json =>
json.asOpt[Comment].map { comment =>
comment.copy(idea = idea).save.fold(
errors => JsonBadRequest(errors),
comment => Ok(toJson(comment).toString)
)
}.getOrElse (JsonBadRequest("Invalid Comment entity"))
}.getOrElse (JsonBadRequest("Expecting JSON data"))
}.getOrElse (JsonBadRequest("Could not find idea with id '%s'".format(ideaId)))
}
我覺得有點討厭所有這些嵌套.maps,我也找了一下單調乏味,每個錯誤處理是在底部
你會如何改進它,使更多的可讀性,同時保持作爲功能慣用斯卡拉代碼?
我在想也許這樣的事情(這是seudo代碼,仍然不能編譯)
def save(ideaId : Long) = CORSAction { request =>
val idea = Idea.findById(ideaId).getOrElse(
return JsonBadRequest("Could not find idea with id '%s'".format(ideaId)))
val json = request.body.asJson.getOrElse(
return JsonBadRequest("Expecting JSON data"))
val comment = json.asOpt[Comment].getOrElse(
return JsonBadRequest("Invalid Comment entity"))
comment.copy(idea = idea).save.fold(
errors => JsonBadRequest(errors),
comment => Ok(toJson(comment).toString)
)
}
PS:我知道這將是更好的避免return語句...
恭喜,你剛剛發明了monads! –
刪除'返回'作爲首發。哦,等等,他們是否應該打破「save」方法的流程? – pedrofurla