2009-09-04 30 views
5

Bộ phận của tôi hiện đang giải quyết một số thực tiễn tốt nhất về mã chung mà chúng tôi muốn thực thi một phần, cung cấp cho nhà phát triển các cấu hình Perl::TidyPerl::Critic.Làm thế nào chúng ta có thể nắm bắt ý kiến ​​bên bằng Perl :: Tidy hoặc Perl :: Critic?

Bây giờ, chúng tôi đang gặp sự cố với nhận xét phụ. Các bình luận bên là thế này:

my $counter = 0; # Reset counter 

Chúng tôi muốn không có ý kiến ​​bên nào cả, vì trong nhiều trường hợp họ có thể được viết trên mã trong câu hỏi, nơi chúng được dễ dàng hơn đọc. Nếu có thể, giải pháp Perl::Tidy sẽ là hoàn hảo, điều này sẽ chuyển một nhận xét phụ sang dòng phía trên, tốt nhất thứ hai là chính sách Perl::Critic (mà tôi chưa tìm thấy ở CPAN) và thứ ba tốt nhất và cuối cùng được các nhà phát triển chú ý chỉ ra những nhận xét đó khi họ thực hiện đánh giá mã.

Có thể triển khai với Perl::Tidy hoặc Perl::Critic không?

Trả lời

17

Tôi nghĩ rằng điều này sẽ làm việc cho bạn (nếu tôi hiểu những gì bạn muốn):

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

Cảm ơn, có vẻ như là một khởi đầu tốt! –

+0

/golfclap Thật tuyệt vời! :) –

+0

Hết sức, tôi bỏ POD ra, nhưng tôi hết tiền. –

3

Tôi không nghĩ có bất kỳ cơ chế nào để thực sự di chuyển nhận xét bên trong Perl::Tidy hoặc trong Perl::Critic. Bạn có thể, tất nhiên, loại bỏ chúng hoàn toàn bằng cách sử dụng -dsc hoặc --delete-side-comments, nhưng có thể bạn không muốn làm điều đó.

Tuy nhiên, chắc chắn có thể mở rộng Perl::Critic để thực hiện việc này, xem cụ thể Perl::Critic::DEVELOPER mô tả cách thực hiện điều này.

Bạn cũng có thể tham khảo một số tiện ích mở rộng nhỏ hơn mà người khác đã viết, chẳng hạn như the source toPerl::Critic::Policy::CodeLayout::RequireASCII, một phần của Perl::Critic::More.

2

Không phải tất cả bình luận bên là xấu. Ví dụ, trong câu trả lời của tôi cho How do I check for a sub-subdirectory in Perl, họ tránh xa con đường và cho phép mọi người xem cấu trúc song song trong mã dễ dàng hơn. Đó là lý do tại sao chúng tôi đặt chúng sang một bên: họ là những người chơi nhỏ tăng cường tuyên bố mà không cần chú ý nhiều đến nó.

Tôi tự mình sử dụng nhận xét trên các dòng để có giải thích chi tiết hơn về động lực, trường hợp đặc biệt, v.v. Tôi sử dụng chúng để làm gián đoạn luồng mã để đảm bảo nhà phát triển đọc chúng vì chúng có thông tin mã bổ sung rất quan trọng.

Và, nếu bạn đang sử dụng Perl :: phê bình, bạn sẽ muốn ở bên bình luận đôi khi :)

....; ## no critic 
+0

Hài hước, '## không có nhà phê bình vượt qua Perl :: Quy tắc phê bình tôi tạo ra trong câu trả lời của tôi. '## không có nhà phê bình nào hơn cả văn bản cũng đi qua, tôi không biết điều này có nên được coi là lỗi hay không. –

0

tái brian d Foy của "Không phải tất cả bình luận bên là xấu" - Đồng ý, các nhận xét phụ sẽ xuất hiện thường xuyên trong mã của bạn nếu bạn sử dụng Smart::Comments.

+0

Nếu bạn muốn sử dụng các chú thích thông minh với Perl :: Quy tắc phê bình mà tôi đã tạo trong câu trả lời của mình, thì bạn chỉ cần thêm dòng này gần đầu: 'return if $ elem-> content = ~/^ \ s * ## # /; '.Nó sẽ làm cho quy tắc bỏ qua các nhận xét bắt đầu bằng ít nhất ba octothorpes. –

Các vấn đề liên quan