Szukaj…


Korzystanie z Perl :: Critic

Jeśli chcesz rozpocząć wdrażanie najlepszych praktyk dla siebie lub swojego zespołu, najlepiej zacząć od Perl :: Critic . Moduł jest oparty na książce Perl Best Practices autorstwa Damiena Conwaya i wykonuje całkiem dobrą robotę, wdrażając zawarte w nim sugestie.

Uwaga: Powinienem wspomnieć (a sam Conway mówi w książce), że są to sugestie. Odkryłem, że w większości przypadków książka zawiera solidne uzasadnienie, choć z pewnością nie zgadzam się z nimi wszystkimi. Ważną rzeczą do zapamiętania jest to, że niezależnie od praktyk, które zdecydujesz się przyjąć, zachowujesz spójność. Im bardziej przewidywalny jest twój kod, tym łatwiej będzie go utrzymać.

Możesz także wypróbować Perl :: Critic w przeglądarce na perlcritic.com .

Instalacja

cpan Perl::Critic

Spowoduje to zainstalowanie podstawowego zestawu reguł i skryptu perkrytycznego, który można wywołać z wiersza poleceń.


Podstawowe użycie

Dokument CPAN dla perlcritic zawiera pełną dokumentację, więc omówię tylko najczęstsze przypadki użycia, aby zacząć. Podstawowym zastosowaniem jest po prostu wywołanie perlcritic na pliku:

 perlcritic -1 /path/to/script.pl

perlcritic działa zarówno na skryptach, jak i na modułach. -1 odnosi się do poziomu ważności reguł, które chcesz uruchomić dla skryptu. Istnieje pięć poziomów, które odpowiadają, ile Perl :: Critic rozdzieli Twój kod.

-5 jest najbardziej delikatny i ostrzega tylko przed potencjalnie niebezpiecznymi problemami, które mogą powodować nieoczekiwane rezultaty. -1 jest najbardziej brutalny i narzeka na rzeczy tak małe, jak twój kod jest uporządkowany czy nie. Z mojego doświadczenia wynika, że utrzymywanie zgodności kodu z poziomem 3 jest wystarczająco dobre, aby unikać niebezpieczeństwa bez nadmiernej persnickety.

Domyślnie wszelkie awarie będą wyświetlać przyczynę i ważność wyzwalacza reguły:

perlcritic -3 --verbose 8 /path/to/script.pl

Debugging module loaded at line 16, column 1.  You've loaded Data::Dumper, which probably shouln't be loaded in production.  (Severity: 4)
Private subroutine/method '_sub_name' declared but not used at line 58, column 1.  Eliminate dead code.  (Severity: 3)
Backtick operator used at line 230, column 37.  Use IPC::Open3 instead.  (Severity: 3)
Backtick operator used at line 327, column 22.  Use IPC::Open3 instead.  (Severity: 3)

Wyświetlanie zasad

Możesz szybko sprawdzić, które reguły są uruchamiane i dlaczego, korzystając z opcji --verbose perlcritic:

Ustawienie poziomu na 8 spowoduje wyświetlenie reguły, która wywołała ostrzeżenie:

perlcritic -3 --verbose 8 /path/to/script.pl

[Bangs::ProhibitDebuggingModules] Debugging module loaded at line 16, column 1.  (Severity: 4)
[Subroutines::ProhibitUnusedPrivateSubroutines] Private subroutine/method '_sub_name' declared but not used at line 58, column 1.  (Severity: 3)
[InputOutput::ProhibitBacktickOperators] Backtick operator used at line 230, column 37.  (Severity: 3)
[InputOutput::ProhibitBacktickOperators] Backtick operator used at line 327, column 22.  (Severity: 3)

Podczas gdy poziom 11 pokaże konkretne powody, dla których reguła istnieje:

perlcritic -3 --verbose 11 /path/to/script.pl

Debugging module loaded at line 16, near 'use Data::Dumper;'.
  Bangs::ProhibitDebuggingModules (Severity: 4)
    This policy prohibits loading common debugging modules like the
    Data::Dumper manpage.

    While such modules are incredibly useful during development and
    debugging, they should probably not be loaded in production use. If this
    policy is violated, it probably means you forgot to remove a `use
    Data::Dumper;' line that you had added when you were debugging.
Private subroutine/method '_svn_revisions_differ' declared but not used at line 58, near 'sub _sub_name {'.
  Subroutines::ProhibitUnusedPrivateSubroutines (Severity: 3)
    By convention Perl authors (like authors in many other languages)
    indicate private methods and variables by inserting a leading underscore
    before the identifier. This policy catches such subroutines which are
    not used in the file which declares them.

    This module defines a 'use' of a subroutine as a subroutine or method
    call to it (other than from inside the subroutine itself), a reference
    to it (i.e. `my $foo = \&_foo'), a `goto' to it outside the subroutine
    itself (i.e. `goto &_foo'), or the use of the subroutine's name as an
    even-numbered argument to `use overload'.
Backtick operator used at line 230, near 'my $filesystem_diff = join q{}, `diff $trunk_checkout $staging_checkout`;'.
  InputOutput::ProhibitBacktickOperators (Severity: 3)
    Backticks are super-convenient, especially for CGI programs, but I find
    that they make a lot of noise by filling up STDERR with messages when
    they fail. I think its better to use IPC::Open3 to trap all the output
    and let the application decide what to do with it.

        use IPC::Open3 'open3';
        $SIG{CHLD} = 'IGNORE';

        @output = `some_command`;                      #not ok

        my ($writer, $reader, $err);
        open3($writer, $reader, $err, 'some_command'); #ok;
        @output = <$reader>;  #Output here
        @errors = <$err>;     #Errors here, instead of the console
Backtick operator used at line 327, near 'my $output = `$cmd`;'.
  InputOutput::ProhibitBacktickOperators (Severity: 3)
    Backticks are super-convenient, especially for CGI programs, but I find
    that they make a lot of noise by filling up STDERR with messages when
    they fail. I think its better to use IPC::Open3 to trap all the output
    and let the application decide what to do with it.

        use IPC::Open3 'open3';
        $SIG{CHLD} = 'IGNORE';

        @output = `some_command`;                      #not ok

        my ($writer, $reader, $err);
        open3($writer, $reader, $err, 'some_command'); #ok;
        @output = <$reader>;  #Output here
        @errors = <$err>;     #Errors here, instead of the console

Ignorowanie kodu

Będą chwile, kiedy nie będziesz mógł zastosować się do polityki Perl :: Critic. W takich przypadkach możesz zawinąć specjalne komentarze „ ## userytic () ” i „ ## no krytyk ” wokół kodu, aby Perl :: Critic je zignorował. Po prostu dodaj reguły, które chcesz zignorować w nawiasach (wielokrotności można oddzielić przecinkiem).

##no critic qw(InputOutput::ProhibitBacktickOperator)
my $filesystem_diff = join q{}, `diff $trunk_checkout $staging_checkout`;
## use critic

Pamiętaj, aby owinąć cały blok kodu, w przeciwnym razie Krytyczny może nie rozpoznać instrukcji ignorowania.

## no critic (Subroutines::ProhibitExcessComplexity)
sub no_time_to_refactor_this {
    ...
}
## use critic

Należy pamiętać, że niektóre zasady są uruchamiane na poziomie dokumentu i nie można ich w ten sposób wyłączyć. Można je jednak wyłączyć ...


Tworzenie trwałych wyjątków

Używanie ## norytic () jest przyjemne, ale kiedy zaczniesz przyjmować standardy kodowania, prawdopodobnie będziesz chciał wprowadzić stałe wyjątki od pewnych reguł. Możesz to zrobić, tworząc plik konfiguracyjny .perlcriticrc .

Ten plik pozwoli ci dostosować nie tylko, które zasady są uruchamiane, ale także sposób ich uruchamiania. Korzystanie z niego jest tak proste, jak umieszczenie pliku w katalogu domowym (w systemie Linux, nie jest pewne, czy jest to to samo miejsce w systemie Windows). Lub możesz określić plik konfiguracyjny podczas uruchamiania polecenia za pomocą opcji --profile :

perlcritic -1 --profile=/path/to/.perlcriticrc /path/to/script.pl

Ponownie, perlkrytyczna strona CPAN ma pełną listę tych opcji. Wymienię kilka przykładów z mojego pliku konfiguracyjnego:

Zastosuj podstawowe ustawienia:

#very very harsh
severity = 1
color-severity-medium = bold yellow
color-severity-low = yellow
color-severity-lowest = bold blue

Wyłącz regułę (zwróć uwagę na myślnik przed nazwą zasady):

# do not require version control numbers
[-Miscellanea::RequireRcsKeywords]

# pod spelling is too over-zealous, disabling
[-Documentation::PodSpelling]

Modyfikowanie reguły:

# do not require checking for print failure ( false positives for printing to stdout, not filehandle )
[InputOutput::RequireCheckedSyscalls]
    functions = open close

# Allow specific unused subroutines for moose builders
[Subroutines::ProhibitUnusedPrivateSubroutines]
private_name_regex = _(?!build_)\w+

Wniosek

Właściwie wykorzystane, Perl :: Critic może być nieocenionym narzędziem pomagającym zespołom utrzymać spójność kodowania i łatwą konserwację bez względu na stosowane przez ciebie najlepsze praktyki.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow