【问题标题】:Groovy: how to factorize code in HibernateCriteriaBuilder?Groovy:如何在 HibernateCriteriaBuilder 中分解代码?
【发布时间】:2011-10-07 12:59:54
【问题描述】:

我正在尝试在闭包中分解一些常规代码。

这是一个示例代码,说明了我想要做什么(请参阅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 闭包中提取方法?

【问题讨论】:

    标签: groovy refactoring closures


    【解决方案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 */ }
    

    这符合您避免在每个方法的参数中传递标准的要求,但老实说,我并没有真正看到这样做的效果。

    在我看来,您在问题中发布的代码更加简洁易读

    【讨论】:

    • 非常感谢您的反馈。事实上,我想我正试图找到一种方法将上下文从父闭包传递给子闭包......我不知道这是否可能以及是否值得。
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多