Цикл против замыкания, читаемый против краткий? - PullRequest
1 голос
/ 06 января 2012

В своем ответе на мой собственный вопрос здесь Я разместил код, и @Dave Newton был достаточно любезен, чтобы предоставить мне gist и показать мне ошибку в моем не очень-Гроовые пути.<-- Groovy pun

Я воспользовался его советом и обновил свой код до Groovier.С тех пор ссылка, которую я делаю (которую Дэйв представляет с переменной 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>")
}

И представление цикла, которое я хочу сделать, будет выглядеть так:

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 ]

2 голосов
/ 06 января 2012

Я считаю, что команда разработчиков должна стремиться быть лучшей, а программирование для наименее знающего / опытного разработчика не поддерживает это. Важно, чтобы более чем один человек в команде знал, как читать код, который разработан. Так что, если вы единственный, кто может это прочитать, научите кого-то еще. Если вы беспокоитесь о том, что кто-то новичок в команде сможет прочитать его, я чувствую, что его будет одинаково трудно читать, поскольку не хватит знаний в предметной области. Что бы я сделал, хоть немного разбил:

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 голос
/ 17 января 2012

Идиоматический язык хорош, люди быстро выучат общие идиомы. "Умная" заводная, на мой взгляд, скорее всего просто сбивает с толку.

...