Groovy: как разложить код в HibernateCriteriaBuilder? - PullRequest
0 голосов
/ 07 октября 2011

Я пытаюсь разложить какой-нибудь отличный код внутри замыкания.

Вот пример кода, иллюстрирующий то, что я хочу сделать (см. HibernateCriteriaBuilder ) базовый код:

def criteria  = Account.createCriteria()
def results = criteria  {
  if(A) {
    // full code section when A
  } 
  if(B) {
    // full code section when B
  }
  ...
  if(N) {
    // full code section when N
  }
}

Теперь я хочу извлечь блок условий в методе, чтобы иметь возможность использовать их в других критериях. Вот код, который у меня сейчас есть:

def criteria = Account.createCriteria()
def results = criteria  {
 a(criteria)
 b(criteria)
 ...
 n(criteria)
}
def a(criteria) { if(A) /* full code section when A */ }
def b(criteria) { if(B) /* full code section when B */ }
...
def n(criteria) { if(N) /* full code section when N */ }

Есть ли отличный способ избежать передачи критериев в аргументе каждого метода? (другими словами, есть ли способ получить контекст вызова?)

И, чтобы распространить это на другое замыкание, как извлечь метод из Groovy замыкания?

1 Ответ

1 голос
/ 07 октября 2011

Одна из возможностей - изменить методы a, b, n на замыкания, а затем установить для их свойства delegate значение criteria перед их вызовом, например,

def criteria = Account.createCriteria()

def results = criteria  {
   a.delegate = criteria
   a()
}

def a = { if(A) /* full code section when A */ }

Это соответствует вашему требованию избегать необходимости передавать критерии в аргументе каждого метода, но, честно говоря, я не очень понимаю, чего это достигает.

Код, который вы разместили в своем вопросе, на мой взгляд, более компактный и читаемый

...