Groovy模板 - 代码生成

Groovy模板 - 代码生成

问题描述:

我在寻求建议和选择作为代码使用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() 

如果这是你所生成的模板是矫枉过正。你可以直接调用dataCasesClosure来获得它的输出。

假设它是一个更大的模板的一部分,那么我认为使用闭包为特别复杂的零件产生输出是非常合理的,就像你已经完成了一样。我亲自以极高的规模完成了这项工作,取得了良好的效果。