2009-09-04 7 views
5

Il mio dipartimento si sta attualmente occupando di alcune best practice di codice generale, che vorremmo applicare in qualche modo, fornendo agli sviluppatori le configurazioni Perl::Tidy e Perl::Critic.Come possiamo ottenere commenti secondari usando Perl :: Tidy o Perl :: Critic?

Ora abbiamo problemi con i commenti laterali. Il commento lato è questo:

my $counter = 0; # Reset counter 

Abbiamo preferirebbe non avere commenti collaterali a tutti, dal momento che nella maggior parte dei casi essi possono essere scritti sopra il codice in questione, dove sono più facilmente leggibili. Se possibile, una soluzione Perl::Tidy sarebbe perfetta, che sposterebbe un commento laterale alla riga sopra di essa, in secondo luogo sarebbe una politica Perl::Critic (che non ho trovato anche in CPAN) e la terza migliore e l'ultima sarebbe essere sviluppatori facendo attenzione a segnalare quei commenti quando eseguono le revisioni del codice.

È possibile implementare con Perl::Tidy o Perl::Critic?

risposta

17

credo che questo dovrebbe funzionare per voi (se ho capito quello che vuoi):

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

Grazie, sembra un buon inizio! –

+0

/golfclap Ben fatto! :) –

+0

Scaduto male, ho lasciato fuori il POD, ma ho finito i tuits. –

3

Non penso ci sia alcun meccanismo per spostare effettivamente i commenti laterali in Perl::Tidy o in Perl::Critic. Puoi, ovviamente, rimuoverli completamente usando -dsc o --delete-side-comments, ma probabilmente non vuoi farlo.

Tuttavia, è possibile estendere lo Perl::Critic per fare ciò, vedere in particolare Perl::Critic::DEVELOPER che descrive come ciò viene eseguito.

È anche possibile fare riferimento ad alcune delle estensioni più piccole che altre hanno scritto, ad esempio the source toPerl::Critic::Policy::CodeLayout::RequireASCII, parte di Perl::Critic::More.

2

Non tutti i commenti indesiderati sono cattivi. Ad esempio, nella mia risposta allo How do I check for a sub-subdirectory in Perl, sono fuori mano e consentono alle persone di vedere più facilmente la struttura parallela nel codice. Ecco perché li mettiamo da parte: sono giocatori minori che migliorano una dichiarazione senza richiamare molta attenzione su di essa.

Uso i commenti sulle righe da soli per spiegazioni molto più dettagliate sulla motivazione, sui casi speciali e così via. Li uso per interrompere il flusso del codice per garantire che lo sviluppatore li legga perché hanno informazioni extra-codice molto importanti.

E, se si sta utilizzando Perl :: Critic, si sta andando a voler commenti collaterali a volte :)

....; ## no critic 
+0

In modo umoristico, '## no critic' passa la regola Perl :: Critico che ho creato nella mia risposta. passa anche "## no critic even more text", non so se questo dovrebbe essere considerato un bug. –

0

re brian d foy di "Non tutti i commenti indesiderati sono cattivi" - D'accordo, i commenti laterali verranno visualizzati frequentemente nel codice se si utilizza Smart::Comments.

+0

Se si desidera utilizzare commenti intelligenti con la regola Perl :: Critico che ho creato nella mia risposta, è sufficiente aggiungere questa riga nella parte superiore: 'return if $ elem-> content = ~/^ \ s * ## # /; '.Farà in modo che la regola ignori i commenti che iniziano con almeno tre ottototteri. –

Problemi correlati