2009-09-04 33 views
5

我的部門目前正在處理一些通用代碼最佳實踐,我們希望這些實踐得到部分實施,爲開發人員提供Perl::TidyPerl::Critic配置。我們如何使用Perl :: Tidy或Perl :: Critic來捕獲邊註釋?

現在我們遇到了一些問題。側的評論是這樣的:

my $counter = 0; # Reset counter 

我們寧願無任何副作用的意見可言,因爲在大多數情況下,他們可以有問題的代碼,在那裏他們更容易閱讀上面書寫。如果可能的話,一個Perl::Tidy解決方案將是完美的,這將會將一條評論轉移到它上面的行,第二最佳將是一個Perl::Critic政策(我還沒有在CPAN中找到),第三最好和最後一個當開發人員在做代碼評論時注意將這些評論指出來。

是否可以使用Perl::TidyPerl::Critic執行?

回答

17

我認爲這應該爲你工作(如果我明白你想要什麼):

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

謝謝,看起來像一個好開始! – 2009-09-04 14:30:56

+0

/golfclap完成! :) – 2009-09-04 14:33:35

+0

做得不好,我忽略了POD,但是我跑出了tuits。 – 2009-09-04 14:39:42

3

我不認爲在Perl::TidyPerl::Critic中有實際移動邊註釋的機制。當然,您可以使用-dsc--delete-side-comments完全刪除它們,但您可能不想這樣做。

但是,絕對有可能擴展Perl::Critic來做到這一點,具體參見Perl::Critic::DEVELOPER,它描述了這是如何實現的。

您也可以參考其他人寫的一些較小的擴展,如the source toPerl::Critic::Policy::CodeLayout::RequireASCII,部分Perl::Critic::More

2

並非所有的端註釋都是不好的。例如,在我對How do I check for a sub-subdirectory in Perl的回答中,他們保持不變,讓人們更容易地看到代碼中的並行結構。這就是爲什麼我們把他們放在一邊:他們是小型球員,不用多加註意就能增強聲明。

我使用自己的評論來更詳細地解釋動機,特殊情況等等。我使用這些來中斷代碼流,以確保開發人員閱讀它們,因爲它們具有非常重要的額外代碼信息。

而且,如果你正在使用Perl ::評論家,你會想一邊評論,有時:)

....; ## no critic 
+0

幽默地說,## no critic'傳遞我在我的答案中創建的Perl :: Critic規則。 '##沒有批評甚至更多的文字'也通過了,我不知道這是否應該被視爲一個錯誤。 – 2009-09-08 17:25:28

0

重新布賴恩·d FOY的「不是所有的側意見是壞」 - 同意,如果您使用Smart::Comments,那麼端註釋會經常出現在您的代碼中。

+0

如果您想在我的答案中使用Perl :: Critic規則來創建智能註釋,那麼您只需要在頂部附近添加此行:'如果$ elem-> content =〜/^\ s * ## #/;'。它會導致規則忽略以至少三個八刺形開始的註釋。 – 2009-09-08 17:30:43