2011-06-09 100 views
0

我在尋求建議和選擇作爲代碼使用groovy模板。Groovy模板 - 代碼生成

網絡上的所有模板示例都使用了非常有限的邏輯,但我無法克服這一障礙,並且模板中的代碼很實用。

這是可以接受的嗎?有什麼可能是更好的方式來做到這一點?

感謝 彼得

的任務是生成TCL類型的代碼 - 特別是如果再/ ELSIF /其他類型contraint

if { [streq $pm_enrichment('a1') "'aaaa2'"] && [strlen $pm_enrichment('aaaa3')] &&\ 
    [strlen $pm_enrichment('aaaa4') ] } { 
    set pm_enrichment('ResultAAA') 0 
} 
elseif { [streq $pm_enrichment('b1') "'bb2'"] && [strlen $pm_enrichment('bbb3')] &&\ 
[strlen $pm_enrichment('bbbb4') ] } { 
    set pm_enrichment('ResultBBB') 1 
} 
else { [streq $pm_enrichment('c1') "'cc2'"] && [strlen $pm_enrichment('ccc3')] &&\ 
[strlen $pm_enrichment('cccc4') ] } { 
    set pm_enrichment('ResultCCC') 2G 
} 


////////////////////////////////////// 
def dataCasesClosure= {-> 
    pos=0 
    arrSorted = [] 
    mapStmt.each{arrSorted.add(it.key) } 
    arrSorted = arrSorted.sort() 
    outStr='''''' 

arrSorted.each { i -> 
    tmpStatement = statement 
    tmpResultStmt = resultStmt 
    list=mapStmt[i] 
    resultList=mapResultStmt[i] 

pos=0 
int index = tmpStatement.indexOf(keyword); 
while (index >=0){ 
    val = list[pos].replaceAll(~'"','') 
    pos +=1 
    tmpStatement=tmpStatement.replaceFirst(~/#/,/${val}/) 
    index = tmpStatement.indexOf(keyword, index+keyword.length()) ; 
} 

if (tmpStatement ==~/\W+$/) { 
    tmpStatement=tmpStatement[0..-2] 
} 

pos=0 
index = tmpResultStmt.indexOf(keyword); 
while (index >=0){ 
    val = resultList[pos] 
    pos +=1 
    tmpResultStmt=tmpResultStmt.replaceFirst(~/#/,/${val}/)     
    index = tmpResultStmt.indexOf(keyword, index+keyword.length()) ; 
} 

if (i==0) { 
    outStr= "if {${tmpStatement} } { \n\t\t ${tmpResultStmt} \n }" 
} else if (i < arrSorted.size()-1 ){ 
    outStr += "elseif {${tmpStatement} } { \n\t\t ${tmpResultStmt} \n }" 
} else { 
    outStr += "else {${tmpStatement} } { \n\t\t ${tmpResultStmt} \n }" 
} 
} 

outStr 

} // ### dataCasesClosure 

def valuesIfThenStmt= [ 
"statement":dataCasesClosure 
] 

tplIfThenStmt = ''' 
############################## 
${statement} 
''' 

def engine = new SimpleTemplateEngine() 
templateResult = engine.createTemplate(tplIfThenStmt).make(valuesIfThenStmt) 
println templateResult.toString() 

回答

1

如果這是你所生成的模板是矯枉過正。你可以直接調用dataCasesClosure來獲得它的輸出。

假設它是一個更大的模板的一部分,那麼我認爲使用閉包爲特別複雜的零件產生輸出是非常合理的,就像你已經完成了一樣。我親自以極高的規模完成了這項工作,取得了良好的效果。