2009-09-04 17 views
5

Mój wydział obecnie pracuje nad pewnymi ogólnymi sprawdzonymi metodami kodowania, które chcielibyśmy nieco wymusić, zapewniając programistom konfiguracje Perl::Tidy i Perl::Critic.Jak możemy łapać komentarze boczne używając Perl :: Tidy lub Perl :: Critic?

Teraz mamy problemy z bocznymi komentarzami. Komentarz strona jest taka:

my $counter = 0; # Reset counter 

Wolelibyśmy nie mają boczne komentarzy w ogóle, ponieważ w większości przypadków mogą być napisane powyżej kodu w pytaniu, gdzie są one łatwiej czytać. Gdyby było to możliwe, idealne byłoby rozwiązanie Perl::Tidy, które przesunąłoby komentarz boczny do linii nad nim, drugie miejsce to polityka Perl::Critic (której też nie znalazłem w CPAN) i trzecia najlepsza, a ostatnia bądźcie deweloperami dbającymi o wskazanie tych komentarzy podczas przeglądania kodu.

Czy można wykonać za pomocą Perl::Tidy lub Perl::Critic?

Odpowiedz

17

myślę, że to powinno działać dla ciebie (jeśli dobrze zrozumiałem, co chcesz):

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; 
+0

Dzięki, wygląda na dobry początek! –

+0

/golfclap Nicely done! :) –

+0

Źle zrobione, pominąłem POD, ale zabrakło mi tuitów. –

3

Nie sądzę, aby istniał jakikolwiek mechanizm służący do przenoszenia komentarzy bocznych w Perl::Tidy lub w Perl::Critic. Możesz je oczywiście całkowicie usunąć przy użyciu -dsc lub --delete-side-comments, ale prawdopodobnie nie chcesz tego robić.

Jednak na pewno można przedłużyć Perl::Critic, aby to zrobić, patrz w szczególności Perl::Critic::DEVELOPER, który opisuje, w jaki sposób jest to realizowane.

Można również odwoływać się do niektórych mniejszych rozszerzeń napisanych przez innych, takich jak the source toPerl::Critic::Policy::CodeLayout::RequireASCII, część z Perl::Critic::More.

2

Nie wszystkie niepożądane komentarze są złe. Na przykład, w mojej odpowiedzi na How do I check for a sub-subdirectory in Perl, nie przeszkadzają i pozwalają ludziom łatwiej zobaczyć równoległą strukturę kodu. Dlatego położyliśmy ich na bok: są drobnymi graczami, którzy wzmacniają zdanie bez zwracania na nie dużej uwagi.

Używam komentarzy na liniach, aby uzyskać bardziej szczegółowe wyjaśnienia dotyczące motywacji, specjalnych przypadków i tak dalej. Używam ich, aby przerwać przepływ kodu, aby zapewnić, że programista je odczyta, ponieważ mają bardzo ważne informacje dodatkowe.

A jeśli używasz Perl :: Krytyk, będziesz chciał komentarze boczne czasami :)

....; ## no critic 
+0

Humorystycznie "## no critic" mija przepis Perla :: Critic, który stworzyłem w mojej odpowiedzi. '## no critic jeszcze więcej text' również przechodzi, nie wiem, czy powinno to być uznane za błąd. –

0

re Brian d Foy w „Nie wszystkie niepożądane komentarze są złe” - Zgoda, komentarze boczne pojawiają się często w twoim kodzie, jeśli używasz Smart::Comments.

+0

Jeśli chcesz używać inteligentnych komentarzy z regułą Perl :: Critic, którą utworzyłem w mojej odpowiedzi, wystarczy dodać tę linię w górnej części: 'return if $ elem-> content = ~/^ \ s * ## # /; '.Spowoduje to, że reguła zignoruje komentarze zaczynające się od co najmniej trzech ośmiokątów. –