在回答我自己的问题here时,我发布了一些代码,而@Dave Newton非常友好地向我提供了gist,并以不那么Groovy的方式向我显示错误。 <-- Groovy pun
我接受了他的建议并将我的代码修改为Groovier。从那以后,我正在制作的链接(Dave用replaceWith
变量表示)已经改变了。现在关于我想要做的事情的闭包表示如下:
int i = 1
errorList = errorLinksFile.readLines().grep { it.contains "href" }.collect { line ->
def replaceWith = "<a href=\"${rooturl}${build.url}parsed_console/log_content.html#ERROR${i++}\">"
line.replaceAll(pattern, replaceWith).minus("</font>")
}
我想做的for循环表示如下所示:
def errorList = []
def i = 1
for(line in errorLinksFile.getText().split("\n")){
if(!line.contains("href")){
continue
}
errorList.add(line.replaceAll(pattern, "<a href=\"${rooturl}${build.url}parsed_console/log_content.html#ERROR${i++}\">").minus("</font>"))
}
封闭版本肯定更简洁,但我担心如果我总是走“Groovier”路线,那么代码可能比其他程序员更难理解而不是简单的for循环。那么什么时候Groovier更好,什么时候我应该选择可能被所有程序员理解的代码呢?
答案 0 :(得分:2)
我相信开发团队应该努力做到最好,并且对知识渊博/经验最差的开发人员的编码不支持这一点。重要的是团队中不止一个人知道如何阅读开发的代码。所以,如果你是唯一可以阅读它的人,那就教别人吧。如果你担心团队的新人能够阅读它,我觉得他们同样难以阅读,因为缺乏领域知识。我会做的是稍微分解一下:
def originalMethod() {
//Do whatever happens before the given code
errorList = getModifiedErrorsFromFile(errorLinksFile)
}
def getModifiedErrorsFromFile(errorLinksFile) {
int i = 1
getHrefsFromFile(errorLinksFile).collect { line ->
def replaceWith = getReplacementTextForLine(i)
i++
line.replaceAll(pattern, replaceWith).minus("</font>")
}
}
def getHrefsFromFile(errorLinksFile) {
errorLinksFile.readLines().grep { it.contains "href" }
}
def getReplacementTextForLine(i) {
"<a href=\"${rooturl}${build.url}parsed_console/log_content.html#ERROR${i}\">"
}
这样,如果下一个人不能立即了解发生了什么,他们应该能够根据方法名称推断出发生了什么。如果这不起作用,添加测试将有助于下一个人了解正在发生的事情。
我的2美分。虽然好主题!!!
答案 1 :(得分:1)
惯用语很好,人们会很快学会常用的习语。在我看来,“聪明”的常规更容易让人感到困惑。