私はこれらのようないくつかの機能を持っています:
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 はどうあるべきでしょうか?
それ以外の場合、この例でコードの重複を削除する簡単な方法がわかりましたか?