1. Der Vortragende
Perl-Programmierung
Perl::Critic
Perl::Critic
Dein Nachfolger könnte ein Psychopath sein
Renée Bäcker
Chemnitzer LinuxTage 2011
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
2. Der Vortragende
Perl-Programmierung
Perl::Critic
Über mich...
Renée Bäcker
Perl-Programmierer seit 2002
Perl-Services.de
Schulungen
Programmierung
OTRS
Perl-Magazin
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
3. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Ist das wirklich Perl?
($/,$%,$.,$-)=(gmtime($^T+=86400))[3..6]while($/-12)/4|$
2||++$printf
1900+$..-%02d-%02dn,++$%,$/==8?8:$/-7
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
4. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Perl == RSA?
The only language that looks the same before and after RSA
encryption. Keith Bostic
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
5. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Solcher Code macht Dich glücklich
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
6. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
... aber nur für einen kurzen Augenblick
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
7. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
... nach ein paar Monaten
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
8. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Im Team ist so etwas unangebracht
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
9. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Im Team ist so etwas unangebracht
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
10. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Ein Team braucht Regeln
Tim, 26, C Perl
for ( $i = 0; $i = $#zahlen; $i++ ) {
$array[i] = $zahlen[$i] * 2;
}
Michael, 27, schon länger bei Perl dabei
for my $i ( 0 .. $#zahlen ) {
$array[$i] = $zahlen[$i] * 2;
}
Sabrina, 25, Perl mit der Muttermilch aufgenommen ;-)
my @array = map{ $_ * 2 }@zahlen;
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
11. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Ein Team braucht Regeln
Die Regeln sollten für einige Punkte abdecken:
Code-Layout
erlaubte Konstrukte
Perl-Version
Metadaten
Projektinformationen (VCS,...)
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
12. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Regeln für Perl-Code
Firmen haben Regeln für
Java
C/C++
...
Aber nur wenige haben festgelegte Regeln für Perl.
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
13. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Regeln für Perl-Code
Ohne Regeln...
... gibt es einen Wildwuchs an Perl-Code. Wartbarkeit nimmt ab.
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
14. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Das Buch
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
15. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Was Damian Conway beschreibt...
Best Practices
ein paar wenige Kapitel sind veraltet (z.B. Objekte )
Vorschläge
seine Erfahrung
absolut lesenswertes Material
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
16. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Gesetz?? - Viele halten es dafür...
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
17. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
... ist es aber nicht
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
18. Der Vortragende Oh mein Gott...
Perl-Programmierung Regeln
Perl::Critic Perl Best Practices
Kategorien
Conway zeigt Best Practices für eine ganze Reihe von Kategorien:
Code-Layout
Namenskonventionen
Werte und Ausdrücke
Variablen
Kontrollstrukturen
...
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
19. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was hat Perl Best Practices mit Perl::Critic zu tun?
Auf der Basis des Buchs wurde Perl::Critic entwickelt. Damit lässt
sich der eigene Code analysieren...
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
20. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was ist Perl::Critic?
Hilft dem Programmierer Fehler zu vermeiden, mehr oder
weniger wie use warnings und use strict
mehr...
Perl::Critic schaut nicht auf die einfache syntaktische Korrektheit,
sondern achtet darauf, dass gewisse Regeln eingehalten werden -
z.B. ob Subroutinennamen CamelCase sind oder nicht.
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
21. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was ist Perl::Critic?
Hilft dem Programmierer Fehler zu vermeiden, mehr oder
weniger wie use warnings und use strict
weniger...
Perl::Critic kompiliert den Code nicht, sondern parst ihn dank
PPI als Dokument.
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
22. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Ein erstes Beispiel
Ein erstes Beispiel
#!/usr/bin/perl
print Hallo Chemnitz;
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
23. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Ausgabe
Ein erstes Beispiel
~ perlcritic 1.pl
Code before strictures are enabled at line 3, column 1. See page
429 of PBP. ( Severity: 5)
perlcritic wird mit Perl::Critic installiert
Wir haben gegen eine Regel verstoÿen
Es sagt uns, wo wir das in Perl Best Practices nden können
Wie schlimm ist unser Code wirklich
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
24. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Ausgabe
Ein erstes Beispiel
~ perlcritic 1.pl
Code before strictures are enabled at line 3, column 1. See page
429 of PBP. ( Severity: 5)
perlcritic wird mit Perl::Critic installiert
Wir haben gegen eine Regel verstoÿen
Es sagt uns, wo wir das in Perl Best Practices nden können
Wie schlimm ist unser Code wirklich
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
25. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Ausgabe
Ein erstes Beispiel
~ perlcritic 1.pl
Code before strictures are enabled at line 3, column 1. See page
429 of PBP. ( Severity: 5)
perlcritic wird mit Perl::Critic installiert
Wir haben gegen eine Regel verstoÿen
Es sagt uns, wo wir das in Perl Best Practices nden können
Wie schlimm ist unser Code wirklich
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
26. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Ausgabe
Ein erstes Beispiel
~ perlcritic 1.pl
Code before strictures are enabled at line 3, column 1. See page
429 of PBP. ( Severity: 5)
perlcritic wird mit Perl::Critic installiert
Wir haben gegen eine Regel verstoÿen
Es sagt uns, wo wir das in Perl Best Practices nden können
Wie schlimm ist unser Code wirklich
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
27. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regeln
Die Überprüfung basiert auf bestimmten Regeln - in diesem
Fall TestingAndDebugging::RequireUseStrict.
Diese Regeln werden mit Perl::Critic mitgeliefert
... oder werden von anderen Module geliefert (z.B.
Perl::Critic::OTRS)
... oder man schreibt selbst welche
Regeln die Bugs vermeiden .. Regeln kosmetischer Natur
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
28. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regeln
Die Überprüfung basiert auf bestimmten Regeln - in diesem
Fall TestingAndDebugging::RequireUseStrict.
Diese Regeln werden mit Perl::Critic mitgeliefert
... oder werden von anderen Module geliefert (z.B.
Perl::Critic::OTRS)
... oder man schreibt selbst welche
Regeln die Bugs vermeiden .. Regeln kosmetischer Natur
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
29. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regeln
Die Überprüfung basiert auf bestimmten Regeln - in diesem
Fall TestingAndDebugging::RequireUseStrict.
Diese Regeln werden mit Perl::Critic mitgeliefert
... oder werden von anderen Module geliefert (z.B.
Perl::Critic::OTRS)
... oder man schreibt selbst welche
Regeln die Bugs vermeiden .. Regeln kosmetischer Natur
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
30. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Nochmal...
Regeln kosmetischer Natur?!?
Gleiches Programm, aber...
~ perlcritic -severity=1 1.pl
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
31. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Ausgabe
... viel mehr Fehler
Code is not tidy at line 1, column 1. See page 33 of PBP. (Severity:
1)
RCS keywords $Id$ not found at line 1, column 1. See page 441 of
PBP. (Severity: 2)
RCS keywords $Revision$, $HeadURL$, $Date$ not found at line 1,
column 1. See p age 441 of PBP. (Severity: 2)
RCS keywords $Revision$, $Source$, $Date$ not found at line 1,
column 1. See page 441 of PBP. (Severity: 2)
No package-scoped $VERSION variable found at line 1, column
1. See page 404 o f PBP. (Severity: 2)
Return value of agged function ignored - print at line 3, column 1.
See pages 208,278 of PBP. (Severity: 1)
Code before strictures are enabled at line 3, column 1. See page
429 of PBP. ( Severity: 5)
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
32. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was ist passiert?
Warum gibt es jetzt viel mehr Warnungen?
Wir wollten, dass Perl::Critic viel pingeliger ist! -severity=1
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
33. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Severities
Severities gewichtet die Regeln
5 (gentle) Schwerwiegenste Regeln
4 (stern)
3 (harsh)
2 (cruel)
1 (brutal) Kosmetische Regeln
Wer Regeln entwirft muss diese Wichtigkeit festlegen - kann aber
noch angepasst werden.
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
34. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Ein weiteres Beispiel
Hier ist alles ok, oder?
#!/usr/bin/perl
# $Id$
use strict;
use warnings;
our $VERSION = 0.01;
my $has_flag = check_flag();
print No flag if !$has_flag;
sub check_flag {
return 1;
}
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
35. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Der Fehler
Nein, doch noch eine Meldung...
~perlcritic -severity=2 2.pl
Postx control if used at line 13, column 17. See pages 93,94 of
PBP. (Severity: 2)
Ich bin aber ein Freund des nachgestellten if. Was nun?
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
36. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Der Fehler
Nein, doch noch eine Meldung...
~perlcritic -severity=2 2.pl
Postx control if used at line 13, column 17. See pages 93,94 of
PBP. (Severity: 2)
Ich bin aber ein Freund des nachgestellten if. Was nun?
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
37. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Regeln ausschlieÿen
Man kann Regeln auch ausschlieÿen. Perl Best Practices liefert
Anregungen, wie man programmieren kann, man muss aber nicht
mit allem einverstanden sein.
Es gibt mehrere Wege, um Regeln auszuschlieÿen:
1. Weg
~perlcritic -severity=2 -exclude=ProhibitPostxControls 2.pl
2.pl source OK
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
38. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Regeln ausschlieÿen
Man kann auch im Code über bestimmte Kommentare die Regeln
ausschalten
2. Weg
use strict;
## no critic (RequireCamelCase)
my $has_flag = check_flag();
## use critic
sub connect {} ## no critic (ProhibitBuiltinHomonyms)
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
39. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Konguration
Eine weitere Möglichkeit ist, eine Kongurationsdatei zu erstellen
.perlcriticrc
INI-Format
Suchreihenfolge:
im aktuellen Verzeichnis
im HOME-Verzeichnis
Angabe in Umgebungsvariablen PERLCRITIC
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
40. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Konguration
Ausschnitt einer Kongurationsdatei
[ControlStructures::ProhibitPostfixControls]
allow = if unless # My custom configuration
severity = cruel # Same as severity = 2
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
41. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Konguration
Ausschnitt einer Kongurationsdatei
[-NamingConventions::Capitalization]
[-ValuesAndExpressions::ProhibitMagicNumbers]
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
42. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Konguration
Ausschnitt einer Kongurationsdatei
[Modules::RequireFilenameMatchesPackage]
add_themes = larry
[TestingAndDebugging::RequireTestLables]
add_themes = larry curly moe
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
43. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Themes
Unterschiedliche Projekte Unterschiedliche Kongurationen
Themes sind die Lösung
Themes sind Gruppierungen von Regeln.
Für jedes Projekt wird ein Theme erstellt und entsprechend
eingebunden
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
44. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Themes im Einsatz
Themes im Einsatz
~perlcritic -theme=core 3.pl
Code is not tidy at line 1, column 1. See page 33 of PBP. (Severity:
1)
RCS keywords $Id$ not found at line 1, column 1. See page 441 of
PBP. (Severity: 2)
[...]
Subroutine OTRSName is not all lower case or all upper case at
line 6, column 1. See pages 45,46 of PBP. (Severity: 1)
~perlcritic -theme=maintenance 3.pl
3.pl source OK
~perlcritic -theme=otrs 3.pl
Variable, subroutine, and package names have to be in CamelCase
at line 7, colum n 1. (no explanation). (Severity: 5)
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
45. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Roundup
Perl::Critic in der Zusammenfassung
Statische Codeanalyse
Basiert auf Regeln
PPI
Viele Einstellmöglichkeiten
Severeties
Themes
Einzelne Regeln hinzufügen/abschalten
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
46. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic testen
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
47. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
In Projektarbeit einbinden...
Gröÿter Nutzen wenn es direkt in die Projekte eingebunden wird
Direkt in Unittests
Test::Perl::Critic
Als Hooks in Versionskontrollsysteme
Regelmäÿig selbst laufen lassen - schon während der
Entwicklung
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
48. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in Unittests
Einfach ein Testskript erstellen:
98_perl_critic.t
use Test::Perl::Critic;
my $rcfile = File::Spec-catfile( 't', 'perlcriticrc'
);
Test::Perl::Critic-import( -profile = $rcfile );
all_critic_ok();
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
49. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in Unittests
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
50. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in IDEs
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
51. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in IDEs
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
52. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in IDEs
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
53. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in IDEs
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
54. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in VCS
SVN-Hook
SET REPOS=%1
SET TXN=%2
perl D:Repositoryhooksperl_critic.pl %REPOS%
%TXN%
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
55. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in VCS
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
56. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... in VCS
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
57. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Weitere Pakete auf CPAN
Häug reichen die Standardregeln nicht aus.
CPAN liefert noch weitere Pakete mit Regeln:
Perl::Critic::Bangs
Perl::Critic::Lax
Perl::Critic::OTRS
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
58. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... Perl::Critic::Bangs
Für Modulentwickler sehr interessant
ProhibitCommentedOutCode
Wer hat sich noch nicht über gröÿere Mengen alten Codes
geärgert?
ProhibitFlagComments
Überprüft auf Flags wie TODO, JFDI,...
ProhibitNoPlan
Tests sollten einen Plan haben...
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
59. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... Perl::Critic::Bangs
ProhibitNumberedNames
my $var2 ist nicht sehr aussagekräftig
ProhibitVagueNames
my $data ist nichtssagend
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
60. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... Perl::Critic::Lax
An manchen Stellen ist Perl::Critic zu strikt. Hier helfen dann diese
Regeln:
ProhibitEmptyQuotes::ExceptAsFallback
Erlaubt so etwas wie my $var = $test ||
ProhibitStringyEval::ExceptForRequire
String-eval ist nicht gut, aber manchmal braucht man es doch
RequireEndWithTrueConst
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
61. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
... Perl::Critic::OTRS
Wer OTRS-Entwicklung betreibt, kann sich diese Regeln
anschauen:
RequireCamelCase
AllesMussInCamelCaseGeschriebenWerden (Subs, Variablen,...)
RequireParensWithMethods
Alle Nicht-Builtin-Methodenaufrufe müssen Klammern haben
...
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
62. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Eigene Regeln
Aber manchmal reichen auch diese Erweiterungen auf dem CPAN
nicht!
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
63. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Wie arbeitet Perl::Critic?
Wie am Anfang erwähnt, arbeitet Perl::Critic mit PPI! Wer eigene
Regeln entwickeln will, muss sich also mal mit PPI beschäftigen...
Parser für Perl-Dokumente
Parsen nach menschlichen Verständnis
Reines Perl
Relativ langsam
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
64. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was ist eigentlich Perl?
Acme::Buy
use Acme::Buffy;
BUffY bUFFY BUffY bUFFY bUfFy buFfY
bUFfY bUFFY buffy buffY bUffy buFFY buffY
BuFfy bUFfy bufFy BuFFY buffy bUffy buFfY
buffY BuFfy buFfy bUFFy bUfFY buffY buFfY
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
65. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was ist eigentlich Perl?
Acme::DoubleHelix
use Acme::DoubleHelix;
CG
T--A
A---T
A----T
C----G
T----A
A---T
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
66. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl mit PPI parsen
PPI im Einsatz
#!/usr/bin/perl
use strict;
use warnings;
use PPI;
use PPI::Dumper;
my $ppi = PPI::Document-new($0);
my $dumper = PPI::Dumper-new($ppi);
$dumper-print();
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
67. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Baum eines Perl-Programms
Baum eines Perl-Programms
PPI::Document
PPI::Token::Comment '#!/usr/bin/perln'
PPI::Token::Whitespace 'n'
PPI::Statement::Include
PPI::Token::Word 'use'
PPI::Token::Whitespace ' '
PPI::Token::Word 'strict'
PPI::Token::Structure ';'
PPI::Token::Whitespace 'n'
[...]
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
68. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Eine neue Regel
Wir brauchen eine Regel: Methodenaufrufe müssen immer runde
Klammern haben.
Beispielcode
my $obj = CGI-new;
print $obj-header();
print $obj-start_html( -css = 'hallo.css' );
my $hashref = { key = 'value' };
print $hashref-{key};
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
69. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Mehr Infos...
ungültig
my $obj = CGI-new;
PPI-Dump
PPI::Token::Word 'CGI'
PPI::Token::Operator '-'
PPI::Token::Word 'new'
PPI::Token::Structure ';
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
70. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Mehr Infos...
gültig
print $obj-header();
PPI-Dump
PPI::Token::Symbol '$obj'
PPI::Token::Operator '-'
PPI::Token::Word 'header'
PPI::Structure::List ( ... )
PPI::Token::Structure ';
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
71. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Mehr Infos...
gültig
print $obj-start_html( css = 'hallo.css' );
PPI-Dump
PPI::Token::Symbol '$obj'
PPI::Token::Operator '-'
PPI::Token::Word 'start_html'
PPI::Structure::List ( ... )
PPI::Token::Whitespace ' '
PPI::Statement::Expression
[...]
PPI::Token::Structure ';'
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
72. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Mehr Infos...
uninteressant
$hashref-{key};
..
$arrayref-[1];
Das sind einfach Dereferenzierungen...
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
73. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Mehr Infos...
PPI-Dump
PPI::Token::Symbol '$hashref'
PPI::Token::Operator '-'
PPI::Structure::Subscript { ... }
PPI::Statement::Expression
PPI::Token::Word 'key'
PPI::Token::Structure ';'
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
74. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was wir jetzt wissen
Wir haben jetzt alle notwendigen Informationen:
Wir müssen auf PPI::Token::Operator reagieren (-)
Wenn danach ein PPI::Structure::Subscript kommt,
interessiert es uns nicht
Wenn danach ein PPI::Structure::List kommt, ist alles ok
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
75. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was wir jetzt wissen
Wir haben jetzt alle notwendigen Informationen:
Wir müssen auf PPI::Token::Operator reagieren (-)
Wenn danach ein PPI::Structure::Subscript kommt,
interessiert es uns nicht
Wenn danach ein PPI::Structure::List kommt, ist alles ok
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
76. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Was wir jetzt wissen
Wir haben jetzt alle notwendigen Informationen:
Wir müssen auf PPI::Token::Operator reagieren (-)
Wenn danach ein PPI::Structure::Subscript kommt,
interessiert es uns nicht
Wenn danach ein PPI::Structure::List kommt, ist alles ok
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
77. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regel
Die Regel
package
Perl::Critic::Policy::OTRS::RequireParensWithMethods;
use strict;
use warnings;
use Perl::Critic::Utils qw{ :severities
:classification :ppi };
use base 'Perl::Critic::Policy';
use Readonly;
our $VERSION = '0.01';
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
78. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regel
Die Regel
Readonly::Scalar my $DESC =
q{Method invokation should use ()};
Readonly::Scalar my $EXPL =
q{Use -MethodName() instead of
-MethodName.};
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
79. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regel
Die Regel
sub supported_parameters { return; }
sub default_severity { return $SEVERITY_HIGHEST; }
sub default_themes { return qw( otrs ) }
sub applies_to { return 'PPI::Token::Operator' }
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
80. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regel
Die Regel
sub violates {
my ( $self, $elem ) = @_;
return if $elem ne '-';
my $method = $elem-snext_sibling;
return if ref $method eq
'PPI::Structure::Subscript';
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
81. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regel
Die Regel
my $list = $method-snext_sibling;
return if ref $list eq 'PPI::Structure::List';
return $self-violation( $DESC, $EXPL, $elem );
}
1;
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
82. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Perl::Critic Regel
Zusammenfassung eigene Regeln:
erbt von Perl::Critic::Policy
$DESC, $EXPL
Methoden: default_severity, default_themes, applies_to
violates
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
83. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Die eigene Regel testen
Die eigene Regel kann einfach getestet werden:
Neues Object von Perl::Critic erzeugen
Neues Object von der Regel erzeugen
Test laufen lassen
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
84. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Die eigene Regel testen
Test der eigenen Regel
use Test::More;
use Perl::Critic;
use
Perl::Critic::Policy::OTRS::RequireParensWithMethods;
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
85. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Die eigene Regel testen
Test der eigenen Regel
my @valid = (
'CGI-new();',
'$obj-method();',
);
my @invalid = (
'CGI-new;',
'$obj-method;',
);
plan tests = @valid + @invalid;
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
86. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Die eigene Regel testen
Test der eigenen Regel
my $c = Perl::Critic-new( -profile = 'NONE' );
my $policy =
Perl::Critic::Policy::OTRS::RequireParensWithMethods-new;
$c-add_policy( -policy = $policy );
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
87. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Die eigene Regel testen
Test der eigenen Regel
ok( (scalar $c-critique( $_ )) == 0, 'valid' ) for
@valid;
ok( (scalar $c-critique( $_ )) 0, 'invalid' ) for
@invalid;
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
88. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Eigene Perl::Critic Regeln
Wie zu sehen war, ist Perl::Critic ein nützliches Tool, um
Programmierregeln durchzusetzen.
Eigene Regeln sind einfach umzusetzen.
Es gibt keine Entschuldigung mehr, unleserlichen Code zu
schreiben ;-)
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein
89. Der Vortragende Perl::Critic im Einsatz
Perl-Programmierung In Projektarbeit einbinden...
Perl::Critic Perl::Critic::*
Eigene Regeln
Vielen Dank!
Vielen Dank!
Renée Bäcker Perl::Critic - Dein Nachfolger könnte ein Psychopath sein