2016-01-20 60 views
0

我有类似于下面的情况,如果请求来自UI,则在执行其他任何操作之前,必须首先验证请求。但是,如果请求不是从UI提交的 - 但通过EDI说 - >在这种情况下,有一些商务请求如何在请求中填充子数据“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 
    } 
} 

}

回答

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 
} 
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) 
}