다음은 매우 일반적인 플레이 프레임 워크 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)
)
}
추신 : 나는 ... return 문을 피하기 위해 더 나은 것 알고
축하합니다. 방금 모나드를 발명했습니다! –
'return's를 스타터로 제거하십시오. 오, 기다려, 그들은 '저장'방법의 흐름을 깨뜨리는거야? – pedrofurla