我的情况类似于下面的情况,如果请求来自UI,则必须首先验证请求,然后再执行任何其他操作。但是,如果请求未从用户界面提交 - 但请通过EDI提交 - >在这种情况下,有一些商业需求如何儿童数据" id"在持久化父数据并将父数据id用于子数据部分后,在请求中填充。这个细节对于这个问题并不重要。
为了在for
理解中改变方法调用的顺序,我有类似于下面的东西,看起来有点重复和非惯用。有没有更好的方法来实现这一目标?
def persistData(req : Request) = {
req.actionFromUI match{
case Some(_) => for{
validatedReq <- validateRequest(req) //1st thing
transformedReq <- transformRequest(validatedReq)
persitedReq <- persistRequestData(transformedReq)
}
case None => for{
transformedReq <- transformRequest(validatedReq)
persitedReq <- persistRequestData(transformedReq)
validatedReq <- validateRequest(persitedReq) //last thing
}
}
}
答案 0 :(得分:1)
如下:
def persistData(req : Request) = {
val (c1, c2, c3) = req.actionFromUI match{
case Some(_) => (validateRequest(req),
transformRequest(validatedReq),
persistRequestData(transformedReq))
case _ => (transformRequest(validatedReq),
persistRequestData(transformedReq),
validateRequest(persitedReq))
}
for {
f1 <- c1
f2 <- c2
f3 <- c3
} // .. do something here with f1, f2, f3
}
答案 1 :(得分:0)
这样的事情可能(假设你的validateRequest
返回Option[Request]
)?
val (preValidate, postValidate) = req.actionFromUI match {
case Some(_) => (validateRequest _, Option[Request].apply _)
case _ => (Option[Request].apply _, validateRequest _)
}
for {
pre <- preValidate(req)
transformed <- transformRequest(pre)
persisted <- persistRequest(transformed)
post <- postValidate(persisted)
}
或者
def validateRequest(req: Request, pre: Boolean) =
if(req.actionFromUI.isDefined == pre) validateRequest(req) else Some(req)
for {
pre <- validateRequest(req, true)
transformed <- transformRequest(pre)
persisted <- persistRequest(transformed)
post <- validateRequest(persisted, false)
}