根据请求参数更改函数调用顺序



我的情况类似于下面,如果请求来自UI,那么必须先验证请求,然后再执行其他任何操作。但是,如果请求不是从 UI 提交的 - 而是通过 EDI 提交 ->在这种情况下,有一些业务要求在持久化父数据并使用父数据 ID 后如何在请求中填充子数据"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
  }
}

}

像这样的事情怎么样:

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
}

也许是这样的东西(假设您的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)
}

最新更新