Как мы можем поймать побочные комментарии, используя 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.