2009-09-04 5 views
5

Actualmente, mi departamento se está adaptando a algunas de las mejores prácticas de código general, que quisiéramos hacer cumplir un tanto, proporcionando a los desarrolladores las configuraciones Perl::Tidy y Perl::Critic.¿Cómo podemos capturar comentarios secundarios usando Perl :: Tidy o Perl :: Critic?

Ahora estamos teniendo problemas con los comentarios secundarios. El comentario al margen es la siguiente:

my $counter = 0; # Reset counter 

Nos preferiría no tiene comentarios secundarios en absoluto, ya que en la mayoría de los casos que pueden ser escritos por encima del código en cuestión, en el que se leen más fácilmente. Si es posible, una solución Perl::Tidy sería perfecta, lo que movería un comentario lateral a la línea de arriba, la segunda mejor sería una política Perl::Critic (que tampoco he encontrado en CPAN) y la tercera mejor y última sería ser desarrolladores teniendo cuidado de señalar esos comentarios cuando hacen revisiones de código.

¿Es posible implementarlo con Perl::Tidy o Perl::Critic?

Respuesta

17

creo que esto debería funcionar para usted (si he entendido lo que quiere):

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

¡Gracias, parece un buen comienzo! –

+0

/golfclap ¡Bien hecho! :) –

+0

Mal hecho, omití el POD, pero me quedé sin tuits. –

3

No creo que haya ningún mecanismo para mover realmente comentarios laterales en Perl::Tidy o en Perl::Critic. Por supuesto, puede eliminarlos completamente usando -dsc o --delete-side-comments, pero probablemente no quiera hacer eso.

Sin embargo, definitivamente es posible ampliar Perl::Critic para hacer esto, consulte en particular Perl::Critic::DEVELOPER que describe cómo se logra esto.

También podría hacer referencia a algunas de las extensiones más pequeñas que otros han escrito, como the source toPerl::Critic::Policy::CodeLayout::RequireASCII, parte de Perl::Critic::More.

2

No todos los comentarios secundarios son malos. Por ejemplo, en mi respuesta al How do I check for a sub-subdirectory in Perl, se mantienen fuera del camino y permiten que las personas vean la estructura paralela en el código más fácilmente. Es por eso que los ponemos a un lado: son jugadores menores que mejoran una afirmación sin llamar mucho la atención.

Uso los comentarios en las líneas por su cuenta para explicaciones mucho más detalladas de motivación, casos especiales, etc. Los uso para interrumpir el flujo de código para asegurar que el desarrollador los lea porque tienen información de código extra muy importante.

Y, si está utilizando Perl :: crítico, vas a querer los comentarios secundarios a veces :)

....; ## no critic 
+0

Con humor, '## no critical' pasa la regla Perl :: Critic que creé en mi respuesta. '## sin crítica, incluso más texto 'también pasa, no sé si esto debería considerarse un error. –

0

re brian d foy de "No todos los comentarios secundarios son malos" - De acuerdo, los comentarios secundarios aparecerán con frecuencia en su código si usa Smart::Comments.

+0

Si quiere usar comentarios inteligentes con la regla Perl :: Critic que creé en mi respuesta, entonces solo necesita agregar esta línea cerca de la parte superior: 'return if $ elem-> content = ~/^ \ s * ## # /; '.Hará que la regla ignore los comentarios que comienzan con al menos tres octothorpes. –

Cuestiones relacionadas