Groovy:如何在HibernateCriteriaBuilder中分解代码?

时间:2011-10-07 12:59:55

标签: groovy refactoring closures

我正试图在闭包中分解一些groovy代码。

以下示例代码说明了我想要做的事情(请参阅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 个答案:

答案 0 :(得分:1)

一种可能性是将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 */ }

这符合您的要求,即无需在每种方法的参数中传递标准,但说实话,我并没有真正看到它实现了什么。

在我看来,您在问题中发布的代码更紧凑,更易读