0

私はこれらのようないくつかの機能を持っています:

  import reactivemongo.play.json.collection.JSONCollection

  def quotesFuture: Future[JSONCollection] = database.map(_.collection[JSONCollection]("quotes"))

 1:  def getByAuthor(author: String) = Action.async {
 2:    quotesFuture.flatMap{ quotes =>
 3:      quotes
 4:        .find(obj("author" -> author))
 5:        .cursor[JsObject](ReadPreference.primary)
 6:        .collect[List](maxQuotes)
 7:        .map(q => Ok(Json.toJson(q)))
 8:    }
 9:  }
10:
11:  def search(term: String) = Action.async {
12:    quotesFuture.flatMap{ quotes =>
13:      quotes
14:        .find(obj("$text" -> obj("$search" -> term)), textScore)
15:        .sort(textScore)
16:        .cursor[JsObject](ReadPreference.primary)
17:        .collect[List](maxQuotes)
18:        .map(q => Ok(Json.toJson(q)))
19:    }
20:  }

しかし、多くの繰り返しがあります。変更されるのは検索と並べ替えだけなので、次のようにリファクタリングしたいと思います。

100:  def getByAuthor(author: String) = getList { quotes =>
101:    quotes
102:      .find(obj("author" -> author))
103:  }
104:
105:  def search(term: String) = getList { quotes =>
106:    quotes
107:      .find(obj("$text" -> obj("$search" -> term)), textScore)
108:      .sort(textScore)
109:  }
110:
111:  def getList(query: (JSONCollection) => ???) = Action.async {
112:    quotesFuture.flatMap{ quotes =>
113:      query(quotes)
114:        .cursor[JsObject](ReadPreference.primary)
115:        .collect[List](maxQuotes)
116:        .map(q => Ok(Json.toJson(q)))
117:    }
118:  }

問題は???、インライン 111はどうあるべきかということです。

IntelliJ に 14 ~ 15 行目からメソッドを抽出するように要求すると、次のように作成されます。

  def tempdef(term: String, quotes: JSONCollection): GenericQueryBuilder[quotes.pack.type]#Self = {
    quotes
      .find(obj("$text" -> obj("$search" -> term)), textScore)
      .sort(textScore)
  }

IntelliJ によって提案された結果の型はかなり恐ろしいものです。したがって、???111行目は のはずですがGenericQueryBuilder[quotes.pack.type]#Self、変数によって異なりますquotes。これを機能させるには何を置き換える必要があり???ますか?

IntelliJ を使用すると、次のことを参照していることがわかりますquotes.pack

case class JSONCollection(...) {...
  val pack = JSONSerializationPack
}

???111行目を に置き換えてみましたがJSONSerializationPack.type、コンパイルして動作します。

ただし、の実装の詳細を見るのJSONCollectionはごまかしであり、JSONCollection の実装が変更されると、これが機能しなくなる可能性があります。

???では、インライン 111 はどうあるべきでしょうか?

それ以外の場合、この例でコードの重複を削除する簡単な方法がわかりましたか?

4

1 に答える 1