0

高度な検索方法で 500 行のリファクタリングを行う必要があります。クロージャーを使用してこのメ​​ソッドを小さな部分に分割しました。現在、多くのクロージャーがありますが、それらを動的に呼び出したいと考えています。

例えば:

def listCriteria={ ... }
def textCriteria={ ... }
def booleanCriteria={ ... }

criteria.listDistinct {
    criteries.eachWithIndex { crit, i->
        def criteriaType="${crit.type}Criteria"
        ...
    }
}

どうやってやるの?

4

2 に答える 2

0

メソッドを使用すると、次のような文字列からこのメソッドを動的に呼び出すことができます。

def listCriteria() {"list"}
def textCriteria() {"text"}

def string1 = "list"
def string2 = "text"

assert "${string1}Criteria"() == "list"
assert "${string2}Criteria"() == "text"

編集:

クロージャーへの動的参照を取得するエレガントな方法がわかりません。

コントローラー クラスのプロパティを使用して、propertiesすべてのクロージャーを見つけて呼び出すことができます。

def allClosures = this.properties.findAll{Closure.isAssignableFrom(it.value.getClass())}

def callCriteriaClosureByName(name) {
    def criteriaClosure = allClosures.find{it.key == "${name}Criteria"}.value
    if(criteriaClosure)
        criteriaClosure()
}

それほどいいことではありませんが、うまくいくはずです。

于 2013-09-05T07:34:10.473 に答える
0

クロージャはスコーピングに適しています。地図の使い方は?

class Criteria {
  def listDistinct(closure) {
    closure()
  }
}


closures = [ 
  listCriteria : { "list" },
  textCriteria : { "text" },
  booleanCriteria : { "boolean" }
]


def criteries = ["list", "text", "boolean"]
def criteria = new Criteria()

criteria.listDistinct {
    criteries.eachWithIndex { crit, index ->
        def criteriaType=closures["${crit}Criteria"]
        assert criteriaType instanceof Closure
    }
}
于 2013-09-05T16:29:22.737 に答える