5

私はscalaでplayframeworkを使用して次のようなコードを作成しました。

object Application extends Controller {
  def hoge = Action( implicit request =>
    val username = MyCookie.getName.get
    Ok("hello " + username)
  }
}

object MyCookie {
  def getName( implicit request: RequestHeader ) = {
    request.cookies.get("name").map(_.value)
  }
}

同僚からコードレビューをもらいました。彼は、暗黙のパラメータのためにこのコードは読めないと言いました。私は彼の意見に答えることができなかった。では、暗黙的なパラメータを使用するための最良の方法を教えてください。暗黙のパラメータはいつ使用する必要がありますか?

4

1 に答える 1

11

ほとんどの場合、物事を行うための「正しい」方法があり、それらの詳細をほとんど常に無視したい場合は、暗黙のパラメーターを使用する必要があります。または、物事を行う方法がないことが多く、暗黙的に機能するものに機能を提供する場合。

最初のケースの例として、ではscala.concurrent.Future、ほとんどすべてのメソッドが暗黙のを取りますExecutionContextExecutionContext呼び出しから呼び出しまで、自分が何であるかを気にすることはほとんどありません。あなたはそれが機能することを望んでいます。ただし、実行コンテキストを変更する必要がある場合は、明示的なパラメーターとして指定できます。

2番目のケースの例としてCanBuildFrom、コレクションライブラリのsを見てください。何からも何も構築できません。Vector[Option[String]]特定の機能が提供されており、たとえば、多数のsをaにパッケージ化できる暗黙の機能がないことはHashSet[Char]、ライブラリを強力かつ柔軟でありながら健全な状態に保つための主要な方法の1つです。

あなたはどちらもしていません:どうやらあなたは他の場所を犠牲にして一方の場所で少しタイプするのを節約するためにそれを使っているだけです。そして、この場合、そうすることで、その暗黙の要求が実際に使用される場所を把握するためにあらゆる場所を調べる必要があるため、物事がどのように機能するかがわかりにくくなります。入力を節約したい場合は、短い変数名を使用する方がはるかに良いですが、それについて明示的にしてください。

Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) }
于 2013-03-06T13:12:29.273 に答える