2013-02-13 53 views
3

學習Scala並試圖重構以下兩個函數以刪除重複的邏輯。我應該創建一個更高階的函數或其他東西來避免重複的代碼?在調用不同的Domain方法時,只需添加一些與此類重複代碼類似的方法。重構Scala中的高階函數?

對重構有點困惑。使用斯卡拉版本2.10

def authenticate = Action(parse.json) { request => 
    val json = request.body 
    val input = Json.fromJson[User](json) 
    input.asOpt match { 
    case Some(m: User) => Ok(Domain.authenticate(m)).as("application/json") 
    case None => Ok("bad input") 
    } 
} 

def addUser = Action(parse.json) { request => 
    val json = request.body 
    val input = Json.fromJson[User](json) 
    input.asOpt match { 
    case Some(m: User) => Ok(Domain.addUser(m)).as("application/json") 
    case None => Ok("bad input") 
    } 
} 
+2

一個簡單的程序分解(寫一個私有方法來捕捉常見'match'兩種方法的一部分)會做得很好。 – 2013-02-13 04:25:37

回答

0

我也是新來的斯卡拉,但我認爲我們可以做這樣的事情。如果我錯了,請糾正我。

你可以做這樣的事情

def foo(f:Int=>Int,x:Int):Int = {f(x)} 
    foo(x=>x+x,3) 

所以同樣,你可以把你想調入常見函數的函數。

2

我想你可以這樣做(未測試):

private def common[A](f:User=>A)(request:RequestHeader) = { 
    val json = request.body 
    val input = Json.fromJson[User](json) 

    input.asOpt match { 
    case Some(m: User) => Ok(f(m)).as("application/json") 
    case None => Ok("bad input") 
    } 
} 

def addUser = Action(parse.json) { common(Domain.adduser)(_) } 

def authenticate = Action(parse.json) { common(Domain.authenticate)(_) } 
+0

這不會開箱即用。 'f'應該是'f:User => A',並且請求應該被輸入不是'Any'的東西。這個想法是確定的。 – EECOLOR 2013-02-13 07:39:47

+0

我認爲這個請求的分類歸類爲「Any」。如果您有類型,我可以編輯它以反映這一點。該請求也可以設置爲private private [A,B](f:User => A)(request:B)= ...'我想。但設置它以確保它有一個身體對我來說是非常棘手的。 – korefn 2013-02-13 08:23:58

+0

謝謝。該重構做了訣竅,並且是f:是f:User => A – user2066049 2013-02-13 17:18:31