2016-01-20 2 views
0

У меня есть ситуация, подобная ниже, где, если запрос поступает из пользовательского интерфейса, запрос сначала должен быть проверен, прежде чем делать что-либо еще. Однако, если запрос не был отправлен из пользовательского интерфейса, но, скажем, через EDI ->, в этом случае существует некоторый biz req, как «id» дочерних данных заполняется в запросе после сохранения родительских данных и использования родительского идентификатора данных в разделе дочерних данных , эта деталь не важна для этого вопроса.последовательность вызова функции изменения на основе параметра запроса

Для того, чтобы изменить порядок вызовов метода внутри a 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) 
} 
Смежные вопросы