Programmierstil in Perl

9

Ich arbeite in Java, daher verwende ich beim Codieren grundsätzlich das OOP-Paradigma. Ich bin kurz davor, in Perl zu arbeiten, und habe mich gefragt, welchem ​​Paradigma Perl-Entwickler folgen. Im Wiki wird erwähnt, dass es viele Paradigmen unterstützt, aber ich bin nicht sicher, ob ich das verstehe, da es eine Skriptsprache ist.

Meine Frage lautet also: Sind die objektorientierten Muster, mit denen ich in Java vertraut bin, in Perl idiomatisch, oder muss ich meinen Designstil erheblich ändern, um effektives Perl zu schreiben?

Hinweis: Dies ist keine Frage, um Perl zu kritisieren. Ich muss tatsächlich in Perl arbeiten und möchte verstehen, wie sich die aktuelle Art und Weise, wie ich programmiere, ändern wird.

user10326
quelle
3
Im Ernst, machen Sie eine Google-Suche nach "Perl-Philosophie" und schauen Sie hier: perldesignpatterns.com
Robert Harvey
Perl unterstützt OOP. Sie können Klassenhierarchien erstellen, virtuelle Funktionen usw. implementieren. Dies ist nicht die häufigste Verwendung, kann jedoch durchgeführt werden.
Martin York
"Da es sich um eine Skriptsprache handelt" - kann als solche verwendet werden, aber denken Sie daran, dass Perl genauso eine VM ist wie Java - Perl wird (im laufenden Betrieb) zu Bytecode kompiliert, der dann ausgeführt wird. Es gibt keine JIT, aber ansonsten ist es immer noch eine virtuelle Maschine, auf der Ihr Code ausgeführt wird.
Tanktalus

Antworten:

15

Perls Philosophie ist in der Regel die, "das zu tun, was jetzt praktisch ist". Wenn Sie OOP verwenden müssen, ist es da. Es ist nicht in allen Lösungen erforderlich, eine Person zum Schreiben von OOP-Code zu zwingen, wenn es sich um ein einfaches Problem vom Typ "Tun Sie dies, dann dies, dann" handelt, das häufig kontraproduktiv ist.

Die Multi-Paradigmen-Natur von Perl kann in Dingen wie der Schwartzschen Transformation gesehen werden, die sehr funktionale Aspekte hat (in Lisp ist es als "dekorieren-sortieren-undekorieren" bekannt). OOP existiert ebenso wie prozedurale (C wie Programmierung) und imperative (Bash wie "mach das dann das").

Entwurfsmuster sind wiederkehrende Lösungen für häufig auftretende Probleme. Sie existieren in jeder Sprache. Manchmal werden diese Muster Redewendungen genannt, obwohl dies auch auf Dinge verweisen kann, die viel einfacher sind als ein Muster.

Bei Bedarf können viele der klassischen GOF-Entwurfsmuster in Perl implementiert werden. Perl Design Patterns haben viele gebräuchliche Namen, die mit dem GOF vertraut sind. Es ist nicht notwendig, dass alle von ihnen idiomatische Perl sind.

Beachten Sie beim Erkunden von Designmustern in Perl auch "Design Patterns" von Mark Dominus .

Viele halten die Entwurfsmuster für Sprachmängel . In dieser Perspektive sind Entwurfsmuster wie der Iterator in Perl oft nicht erforderlich. Nicht immer - aber oft.

Schreiben Sie zuerst idiomatisches Perl. Versuchen Sie nicht, C in Perl oder Lisp in Perl oder Java in Perl zu schreiben. Perl ist Perl. Wenn es ein Problem gibt, das größer wird, als es das idiomatische Perl bewältigen kann, und Sie komplexere Klassenstrukturen benötigen, schreiben Sie diese. Kennen Sie die Entwurfsmuster, um erkennen zu können, dass "dieses Problem inzwischen so weit fortgeschritten ist, dass eine abstrakte Fabrik benötigt wird" - aber versuchen Sie nicht, eine abstrakte Fabrik in Perl zu erstellen, wenn Sie keine benötigen.

Einige Bibliotheken existieren sowohl in OOP- als auch in traditionelleren Formen. Siehe Soll ich die funktionsorientierten oder objektorientierten CGI-Schnittstellen verwenden? für eine alte SO-Frage, bei der man fragt, wie man die Bibliothek benutzt.

Gemeinschaft
quelle
4
+ 1.Interessante Informationen. Wenn man all dies berücksichtigt, warum gibt es in SO viele Posts, die versuchen, Perl als alte Sprache zu verteidigen / anzugreifen? Scheint mir mächtig und nützlich zu sein.
user10326
2
Jeder hat seine eigene Lieblingssprache. Viele sind der Meinung, dass die Sprache alt und veraltet ist und alles davon entfernt werden sollte, es sei denn, eine Sprache kann New Thing This Week unterstützen. Andere haben viel Zeit in das Erlernen einer bestimmten Sprache investiert und wissen, wie sie an dem Ort funktioniert, an dem sie sich befindet. Dies kann leicht in eine Sprache geändert werden, die sich nicht so schnell bewegt wie The Hot New Language. Perl leidet unter einer besonderen Entrechtung, wenn die Zeit benötigt wird, um Perl 6 zu erhalten (jeden Tag ... ähm ... Jahr jetzt!). Dies sollte einen nicht davon abhalten, Perl zu lernen - es wird an vielen Orten verwendet.
1
Sie werden wahrscheinlich feststellen, dass Perl eine Verkehrssprache für Linux-Skripte ist, die einen großen Teil der Rolle von Shell-Skripten aus früheren Zeiten übernimmt. Nur die standhaftesten Shell-Skripter werden sich beschweren, wenn Sie ein Perl-Skript schreiben und nicht bash, wenn Sie Skripte auf einem * nix-System ausführen. Eines der wichtigsten Dinge für Perl ist CPAN. Wenn Sie eine Bibliothek von angemessener Größe schreiben möchten, überprüfen Sie einfach, ob bereits jemand anderes sie geschrieben hat.
1
Alles, was früher ein Shell-Skript mit einer Komplexität oder höher war, ist jetzt oft ein Perl-Skript. Perl funktioniert häufig auch als Klebeband zwischen Systemen oder Anwendungen. Die String-Verarbeitung hat es auch in mehreren anderen Branchen zu Hause gemacht (insbesondere in der Bioinformatik - sehen Sie sich nur an, wie viele DNA-basierte Fragen im Perl-Tag auf SO vorhanden sind).
4
Perl ist eine robuste und vollständige Programmiersprache. Es kann für Skripte (Automatisierung der Interaktion mit anderen Anwendungen, einschließlich der Shell), zum Erstellen von Dienstprogrammen oder sogar für größere Anwendungen verwendet werden. Der Perl-Hass konzentriert sich in der Regel auf Dinge wie seine dichte Syntax und bis zu einem gewissen Grad auf ein Missverständnis der Tatsache, dass Perl nicht versucht, seinen Benutzern bestimmte Designmuster aufzuzwingen. Ich benutze Perl jeden Tag. Ich benutze auch häufig andere Sprachen. Ich genieße Perls Ausdruckskraft und Kraft. Überwinde die unangenehme Lernphase und du wirst es wahrscheinlich auch lieben.
DavidO
7

Perls Haltung zu Paradigmen ist TMTOWTDI (es gibt mehr als einen Weg, dies zu tun). Dies ist einer der Gründe, warum viele Leute Perl scherzhaft als reine Schreibsprache bezeichnen . Es kann viel einfacher sein, es zu schreiben als zu lesen, da der Stil einer anderen Person möglicherweise völlig anders ist als der Ihre.

Trotzdem wird OOP in Perl sicherlich unterstützt. Wenn Sie viel Code von Drittanbietern verwenden, kann es sich um OOP handeln oder nicht, aber für Ihren eigenen Code können Sie OOP nach Herzenslust ausführen. Ich habe OOP zum ersten Mal in Perl gelernt. Ich habe zuerst C ++ ausprobiert und es hat aus irgendeinem Grund nicht "geklickt".

Karl Bielefeldt
quelle
1
Warum viele Leute es als schlechte Karriereoption betrachten? Es scheint, dass es mächtig ist und andere Sprachen als Teil des Toolset ergänzen kann.
user10326
3
Sagen wir einfach, andere Sprachen sind fast genauso mächtig und haben eine viel inhärentere Struktur. Unternehmen mögen Struktur.
Karl Bielefeldt
Für ein gutes Perl OOP Tutorial überprüfen Sie codeproject.com/Articles/3152/Perl-Object-Oriented-Programming
Pmarcoen
1
Das ist ein gutes OOP-Tutorial, das Perls eingebauten OO-Stil erklärt. Wenn Sie diesen Code etwas ausführlich finden, könnte Sie die Perl-Bibliothek Moose interessieren, die einen Großteil der sich wiederholenden Codierung im integrierten OO automatisiert. Am besten beginnen Sie (IMH0) mit dem eingebauten Stil.
Matt Freake
1
Ich habe Perl nie als schlechte Karriereoption empfunden. Finden Sie eine lokale Perl Mongers-Gruppe, und es besteht die Wahrscheinlichkeit, dass bei fast jedem Meeting jemand Perl-Stellenangebote erwähnt.
DavidO
3

Ich bin in der gleichen Situation, ich benutze Java seit einer langen Zeit,

Der Wechsel zu Perl war ein Schock und eine Erleichterung, aber ich habe ein Buch mit dem Titel "Perl Best Practices" verwendet. Es hilft sehr und wenn Sie die grundlegenden Konzepte von Programmiersprachen verstehen, ist es einfach, einfach damit zu fließen.

Denken Sie daran, mit Perl gibt es mehr als eine Möglichkeit, dies zu tun. Ich habe unzählige Stunden damit verbracht, bestimmten Code zu untersuchen und zu ändern, aber am Ende wird die Arbeit mit einem einfachen Syntaxfehler erledigt.

Sonniger Patel
quelle
0

Es gibt mehrere Möglichkeiten, die Wiederverwendung von Code in Perl zu handhaben. Viele Beispiele machen die Unterscheidung zwischen den Ansätzen nicht klar, und viele Klassen verwenden mindestens zwei.

Ich empfehle, den OO-Stil so oft wie möglich zu verwenden und den EXPORTER nur zu verwenden, wenn Sie mindestens drei oder mehr Klassen haben, die einen relativ kleinen Cluster von Dienstprogrammfunktionen benötigen.

So:

package Foo; 
use Foo::Util qw(util) ;
use strict ; 

sub foo {
}

sub bar {
}

1; 

package Foo::Bar ;
use Foo ; 
use Foo::Util qw(util) ;
our @ISA = qw(Foo) ; 
use strict ; 

sub bar {
}

1; 

package Foo::Util ; 
use Exporter ; 
our @ISA = qw(Exporter) ; 
our @EXPORT = qw(util) ;
use strict ; 

sub util {
}

1;

Ich bevorzuge es, den OO-Ansatz und den EXPORTERAnsatz als zwei verschiedene Dimensionen der Codeverfügbarkeit zu visualisieren , als ob die Funktionen von der x- oder y-Achse in das aktuelle Paket kommen würden.

Im obigen Beispiel:

Foo::Barleitet die Methode foo()von der Klasse abFoo

Foo::Bardefiniert eine bar()Methode, damit die polymorphe Methode bar()nicht von der Klasse abgeleitet wirdFoo

Beide Klassen Foound Foo::BarEmpfangsfunktion EXPORTED( nicht Methode ) util()vom Paket ( nicht Klasse )Foo::Util

Die beiden Systeme scheinen kompliziert zu sein, haben aber einen sehr praktischen Nutzen. Das Verfolgen der Mehrfachvererbung kann schnell schwierig werden. Mit der zweiten Dimension der Codeverfügbarkeit können Sie Ihren Vererbungsbaum klein und überschaubar halten.

Wenn eine Funktion monolithisch und relativ dumm ist, verwenden Sie im Allgemeinen EXPORTER, andernfalls die Vererbung. Aber machen Sie sich überhaupt nicht die Mühe, es EXPORTERsei denn, Sie werden wahrscheinlich mehr als 3 oder 4 Pakete umfassen.

James Aanderson
quelle