Почему делает Perl:: неприязнь Критика с помощью сдвига для заполнения переменных подпрограммы?

В последнее время я решил начать использовать Perl:: Критик чаще на моем коде. После программирования в Perl для близко к 7 годам теперь, я был поселен в с большинством лучших практик Perl долгое время, но я знаю, что всегда существует простор для совершенствования. Одна вещь, которая прослушивала меня, хотя то, что Perl:: Критику не нравится способ, которым я распаковываю _ для подпрограмм. Как пример:

sub my_way_to_unpack {
    my $variable1 = shift @_;
    my $variable2 = shift @_;

    my $result = $variable1 + $variable2;
    return $result;
}

Это - то, как я всегда делал это, и, как его, обсужденный и на PerlMonks и на Переполнении стека, его не обязательно зло также.

Изменение фрагмента кода выше к...

sub perl_critics_way_to_unpack {
    my ($variable1, $variable2) = @_;

    my $result = $variable1 + $variable2;
    return $result;
}

... работы также, но я нахожу, что он тяжелее читает. Я также считал книжные Лучшие практики Perl Damian Conway, и я действительно не понимаю, как мой предпочтительный подход к распаковке подпадает под его предложение для избегания использования @_ непосредственно, как Perl:: Критик подразумевает. У меня всегда создавалось впечатление, что Conway говорил о злобности, такой как:

sub not_unpacking {
    my $result = $_[0] + $_[1];
    return $result;
}

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

Таким образом короче говоря, почему делает Perl:: Критик рассматривает мой предпочтительный путь плохо? Я действительно фиксирую отвратительную распаковку преступления при помощи сдвига?

Был бы это быть чем-то, что люди кроме меня думают, должен быть поднят с Perl:: специалисты по обслуживанию Критика?

16
задан Community 23 May 2017 в 10:29
поделиться

4 ответа

Простой ответ заключается в том, что Perl :: Critic здесь не следует за PBP. В книге прямо указано, что идиома сдвига не только приемлема, но и даже предпочтительнее в некоторых случаях.

11
ответ дан 30 November 2019 в 17:52
поделиться

Запуск perlcritic с - подробный 11 объясняет политики. Однако не похоже, что ни одно из этих объяснений относится к вам.

Always unpack @_ first at line 1, near 
'sub xxx{ my $aaa= shift; my ($bbb,$ccc) = @_;}'.
  Subroutines::RequireArgUnpacking (Severity: 4)
    Subroutines that use `@_' directly instead of unpacking the arguments to
    local variables first have two major problems. First, they are very hard
    to read. If you're going to refer to your variables by number instead of
    by name, you may as well be writing assembler code! Second, `@_'
    contains aliases to the original variables! If you modify the contents
    of a `@_' entry, then you are modifying the variable outside of your
    subroutine. For example:

       sub print_local_var_plus_one {
           my ($var) = @_;
           print ++$var;
       }
       sub print_var_plus_one {
           print ++$_[0];
       }

       my $x = 2;
       print_local_var_plus_one($x); # prints "3", $x is still 2
       print_var_plus_one($x);       # prints "3", $x is now 3 !
       print $x;                     # prints "3"

    This is spooky action-at-a-distance and is very hard to debug if it's
    not intentional and well-documented (like `chop' or `chomp').

    An exception is made for the usual delegation idiom
    `$object->SUPER::something( @_ )'. Only `SUPER::' and `NEXT::' are
    recognized (though this is configurable) and the argument list for the
    delegate must consist only of `( @_ )'.
9
ответ дан 30 November 2019 в 17:52
поделиться

Важно помнить, что большая часть материалов в Perl Best Practices - это всего лишь мнение одного человека о том, что выглядит лучше всего или с чем легче всего работать, и неважно, делаете ли вы это по-другому. Об этом Дамиан говорит во вступительном тексте к книге. Это не значит, что это все так - там много абсолютно важных вещей: например, использование strict .

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

Я стараюсь следовать большей части того, что есть в PBP, но Дамиан может использовать мой аргумент подпрограммы сдвиг и мои , если только он не вырвет их из моих холодных мертвых пальцев. .

Что касается Critic, вы можете выбрать, какие политики вы хотите применять, и даже создать свои собственные, если они еще не существуют.

8
ответ дан 30 November 2019 в 17:52
поделиться

В некоторых случаях Perl :: Critic не может точно обеспечить соблюдение руководящих принципов PBP, поэтому он может обеспечить приближение, которое пытается соответствовать духу руководящих принципов Конвея. И вполне возможно, что мы неверно истолковали или неправильно применили PBP. Если вы обнаружите что-то, что пахнет неправильно, отправьте сообщение об ошибке на адрес (скрыто), и мы сразу же рассмотрим его.

Спасибо,

-Джефф

2
ответ дан 30 November 2019 в 17:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: