У меня есть два очень похожих метода в Grails, что-то вроде «вычислить статистику по ОС» и «вычислить статистику по браузеру» - эффективно обе подготовить некоторые вещи, затем выполнить аналогичный запрос в БД, а затем выполнить действия с результатами. Единственная часть, где методы различаются, это запрос, который они выполняют в середине моего метода -
def summary = c.list {
eq('browser', Browser.get(1)) // OR eq('os', OS.get(1))
between('date', dates.start, dates.end)
}
Мне пришло в голову, что идеальным способом рефакторинга было бы передать первую строку замыкания в качестве параметра метода. Как
doStats (Closure query) {
...
def summary = c.list {
query
between('date', dates.start, dates.end)
}
}
Я пробовал это, но "запрос" игнорируется. Вместо этого я попробовал query (), но затем условие запроса выполняется там, где оно определено, так что это тоже не работает. Я полагаю, что мог бы просто передать все замыкание в качестве параметра, но это кажется неправильным - запрос может также усложниться в будущем.
У кого-нибудь есть идеи получше?