3

Scala を学習し、次の 2 つの関数をリファクタリングして、重複するロジックを削除しようとしています。コードの重複を避けるために、高次関数などを作成する必要がありますか? このような重複コードを使用して、さらにいくつかの同様のメソッドを用意しますが、異なるドメイン メソッドの呼び出しのみが異なります。

リファクタリングについて少し混乱しました。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")
  }
}
4

2 に答える 2

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)(_) } 
于 2013-02-13T06:26:21.223 に答える
0

Scalaも初めてですが、このようなことができると思います。間違っている場合は修正してください。

このようなことができます

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

同様に、呼び出したい関数を共通関数に渡すことができます。

于 2013-02-13T03:42:31.300 に答える