2009-09-04 9 views
5

Mon département s'oriente actuellement vers les meilleures pratiques du code général, que nous aimerions mettre en application, en fournissant aux développeurs les configurations Perl::Tidy et Perl::Critic.Comment pouvons-nous attraper des commentaires secondaires en utilisant Perl :: Tidy ou Perl :: Critic?

Maintenant, nous avons des problèmes avec les commentaires secondaires. Le commentaire côté est la suivante:

my $counter = 0; # Reset counter 

Nous préférons ne pas avoir de commentaires côté du tout, puisque dans la plupart des cas, ils peuvent être écrits au-dessus du code en question, où ils sont plus faciles à lire. Si possible, une solution Perl::Tidy serait parfaite, ce qui déplacerait un commentaire de côté à la ligne au-dessus, la deuxième meilleure serait une politique Perl::Critic (que je n'ai pas trouvée au CPAN non plus) et le troisième meilleur et le dernier serait soyez les développeurs en prenant soin de pointer ces commentaires quand ils font des critiques de code.

Est-il possible de mettre en œuvre avec Perl::Tidy ou Perl::Critic?

Répondre

17

Je pense que cela devrait fonctionner pour vous (si je comprends bien ce que vous voulez):

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

Merci, c'est un bon début! –

+0

/golfclap Bien fait! :) –

+0

Mal fait, j'ai laissé tomber le POD, mais j'ai manqué de tuits. –

3

Je ne pense pas qu'il existe un mécanisme pour déplacer réellement les commentaires secondaires dans Perl::Tidy ou dans Perl::Critic. Vous pouvez, bien sûr, les supprimer complètement en utilisant -dsc ou --delete-side-comments, mais vous ne voulez probablement pas faire cela.

Cependant, il est certainement possible d'étendre Perl::Critic pour ce faire, voir en particulier Perl::Critic::DEVELOPER qui décrit comment cela est accompli.

Vous pouvez également faire référence à certaines extensions plus petites que d'autres ont écrites, telles que the source toPerl::Critic::Policy::CodeLayout::RequireASCII, qui fait partie de Perl::Critic::More.

2

Tous les commentaires sont mauvais côté. Par exemple, dans ma réponse à How do I check for a sub-subdirectory in Perl, ils restent à l'écart et permettent aux gens de voir la structure parallèle dans le code plus facilement. C'est pourquoi nous les mettons de côté: ce sont des joueurs mineurs qui améliorent une déclaration sans trop y prêter attention.

J'utilise les commentaires sur les lignes par leurs propres pour des explications beaucoup plus détaillées de la motivation, des cas spéciaux, et ainsi de suite. Je les utilise pour interrompre le flux de code afin que le développeur les lise car ils ont des informations supplémentaires sur le code.

Et, si vous utilisez Perl de la porte-parole, vous allez vouloir les commentaires indésirables parfois :)

....; ## no critic 
+0

Humoureusement, '## no critic' passe la règle Perl :: Critic que j'ai créée dans ma réponse. "## aucun critique encore plus de texte" passe également, je ne sais pas si cela devrait être considéré comme un bug. –

0

re brian d foy de « Tous les commentaires sont mauvais côté » - D'accord, Les commentaires secondaires apparaîtront fréquemment dans votre code si vous utilisez Smart::Comments.

+0

Si vous voulez utiliser les commentaires intelligents avec la règle Perl :: Critic que j'ai créée dans ma réponse, il vous suffit d'ajouter cette ligne en haut: 'return si $ elem-> content = ~/^ \ s * ## # /; '.La règle ignore les commentaires commençant par au moins trois octothorpes. –

Questions connexes