循环与封闭,可读与简洁?

时间:2012-01-06 15:19:26

标签: coding-style groovy readability

在回答我自己的问题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更好,什么时候我应该选择可能被所有程序员理解的代码呢?

2 个答案:

答案 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)

惯用语很好,人们会很快学会常用的习语。在我看来,“聪明”的常规更容易让人感到困惑。