Метки цикла Perl считаются GOTO? - PullRequest
17 голосов
/ 21 июня 2010

Как правило, это хорошая практика, чтобы избегать GOTO. Помня об этом, я спорил с коллегой по этой теме.

Рассмотрим следующий код:

Line:
    while( <> ) {
        next Line if (insert logic);
    }

Считается ли использование метки цикла в качестве перехода?

Вот что perlsyn в perldoc должен сказать:

Вот как программист C может кодировать определенный алгоритм в Perl:

for (my $i = 0; $i < @ary1; $i++) {
    for (my $j = 0; $j < @ary2; $j++) {
        if ($ary1[$i] > $ary2[$j]) {
            last; # can't go to outer :-(
        }
        $ary1[$i] += $ary2[$j];
    }
    # this is where that last takes me
}

В то время как вот как программист Perl более комфортно использует идиому:

OUTER: for my $wid (@ary1) {
    INNER:   for my $jet (@ary2) {
                 next OUTER if $wid > $jet;
                 $wid += $jet;
             }
       }

Я полагаю, что это не так, потому что вы явно указываете петлю на короткое замыкание и продвигаетесь, однако мой коллега не соглашается, говорит, что это просто вычурное GOTO и его следует избегать. Я ищу убедительный аргумент или документацию, объясняющую, почему это GOTO или нет. Я также приму объяснение, почему это является или не считается хорошей практикой в ​​perl.

Ответы [ 11 ]

1 голос
/ 21 июня 2010

gotos плохие, потому что они создают трудный для понимания код - особенно то, что часто называют «Код спагетти». Что трудно понять о next Line... ??

Вы можете назвать это «именем» цикла, и это действительно то, что поможет подчеркнуть границы цикла. Вы не прыгаете в произвольную точку относительно цикла; Вы возвращаетесь к вершине петли.

К сожалению, если это стандарт группы или дома, то нет ничего, что могло бы убедить группу в том, что это не goto. У меня был менеджер, который настаивал на том, что троичный оператор затрудняет чтение, и предпочитал использовать блоки if для всего. У меня был довольно хороший аргумент, что в выражениях if-else можно сделать что угодно, но троичный указывал на то, что вы ищете конкретное значение. Не продается.

...