Как мы можем поймать побочные комментарии, используя Perl::Tidy или Perl::Critic?

В настоящее время мой отдел работает над некоторыми общими рекомендациями по коду, которые мы хотели бы применить, предоставляя разработчикам Perl::Tidy а также Perl::Critic конфигурации.

Сейчас у нас проблемы с побочными комментариями. Дополнительный комментарий:

my $counter = 0;  # Reset counter

Мы бы предпочли вообще не иметь побочных комментариев, поскольку в большинстве случаев они могут быть написаны над соответствующим кодом, где их легче читать. Если это вообще возможно, Perl::Tidy решение было бы идеальным, что бы переместить побочный комментарий в строку над ним, вторым лучшим будет Perl::Critic политики (которых я не нашел в CPAN) и третье место, и последнее и последнее, будут разработчиками, которые стараются указывать эти комментарии, когда они делают обзоры кода.

Можно ли реализовать с Perl::Tidyили же Perl::Critic?

4 ответа

Решение

Я думаю, что это должно работать для вас (если я понял, что вы хотите):

package Perl::Critic::Policy::CodeLayout::NoSideComments;

use strict;
use warnings;

use Readonly;

use Perl::Critic::Utils qw{ :severities :classification :ppi };
use parent 'Perl::Critic::Policy';

our $VERSION = 20090904;

Readonly::Scalar my $DESC => "side comments are not allowed";
Readonly::Scalar my $EXPL => "put the comment above the line, not next to it";

sub supported_parameters { return                       }
sub default_severity     { return 5                     }
sub default_themes       { return qw( custom )          }
sub applies_to           { return 'PPI::Token::Comment' }

sub violates {
    my ($self, $elem) = @_;

    #look backwards until you find whitespace that contains a 
    #newline (good) or something other than whitespace (error)

    my $prev = $elem->previous_sibling;
    while ($prev) {
        return $self->violation( $DESC, $EXPL, $elem )
            unless $prev->isa("PPI::Token::Whitespace");
        return if $prev->content =~ /\n/;
        $prev = $prev->previous_sibling;
    }

    #catch # after a block start, but leave the #! line alone
    return $self->violation( $DESC, $EXPL, $elem )
        unless $elem->parent->isa("PPI::Document");
    return;
}

1;

Я не думаю, что есть какой-либо механизм для фактического перемещения побочных комментариев в Perl::Tidy или в Perl::Critic, Вы можете, конечно, удалить их полностью, используя -dsc или же --delete-side-comments, но вы, вероятно, не хотите этого делать.

Тем не менее, это определенно возможно продлить Perl::Critic чтобы сделать это, смотрите, в частности, Perl::Critic::DEVELOPER который описывает, как это достигается.

Вы также можете сослаться на некоторые из меньших расширений, написанных другими, например на источник Perl::Critic::Policy::CodeLayout::RequireASCII, часть Perl::Critic::More,

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

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

И, если вы используете Perl::Critic, вам иногда понадобятся побочные комментарии:)

 ....; ## no critic

Re brian d foy: "Не все побочные комментарии плохие" - Согласен, побочные комментарии будут часто появляться в вашем коде, если вы используете Smart:: Comments.

Другие вопросы по тегам