2016-01-20 65 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) 
}