Frage

Perl hat OOP-features, aber Sie sind eher selten verwendet.Wie wollen Sie Sie erstellen und verwenden von Perl-Objekte mit Methoden und Eigenschaften?

War es hilfreich?

Lösung

Sie sollten auf jeden Fall nehmen Sie einen Blick auf Moose.

package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

Elche gibt Sie (unter anderem) einen Konstruktor, eine accessor-Methoden, und geben Sie prüfen für Sie kostenlos!

Also in Ihrem code können Sie:

my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15);     # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5);   # FAILS! Free type check.

Ein guter Ausgangspunkt ist Moose::Manual und Moose::Cookbook

Wenn Sie müssen nur die grundlegenden Sachen, die Sie auch verwenden können Mouse das ist nicht so vollständig, aber ohne die meisten der compile-Zeit-Strafe.

Andere Tipps

Moose, auf jeden Fall.

package Person;
use Moose;
has age => ( isa => Int, is => 'rw'); 
has name => ( isa => Str, is => 'rw'); 
1;

Sofort haben Sie kostenlos eine neue () - Methode, und accessor-Methoden für die Attribute, die Sie gerade definiert mit 'hat'.So können Sie sagen:

my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";

und so weiter.Nicht nur, dass, aber Ihre accessor-Methoden kommen-Typ-geprüft, für freie (und Sie können definieren Ihre eigene Art als auch der standard).Plus erhalten Sie 'erweitert' für Unterklassen, 'mit' für Funktionen/Merkmale, und alle Arten von andere tolle Sachen, die es Ihnen ermöglicht, sich mit den real-job zu schreiben, eine gute robust, wartbar OO-code.

TMTOWTDI, aber dieses funktioniert.

Ich verwende derzeit Object::InsideOut Wann immer ich will Objekte, Ihre ganz nett und wird Ihnen eine Menge von Funktionen über standard-gesegnet hash-Objekte.Having sagte, dass, wenn ich ein neues Projekt starten, würde ich ernsthaft in Elche.

Zwar ist es gut, Lesen Sie den offiziellen PERL-Dokumentation, würde ich NICHT empfehlen, versucht die Rolle Ihres eigenen Objekt-framework, Gebäude oder Objekte mithilfe von hashes, seine weit zu verlockend, nehmen Sie den einfachen Weg und "peak", die direkt in die Objekte "private" Variablen vollständig zu brechen Kapselung, diese kommen zurück zu beißen, wenn Sie wollen zu überarbeiten die Objekt.

Perl-Objekte sind NICHT nur gesegnet hashes.Sie sind gesegnet REFERENZEN.Sie können (und meist sind), gesegnet hash-Referenzen, aber Sie könnten genauso leicht gesegnet Skalar oder array-Referenzen.

Die offiziellen tutorial auf dem CPAN Website ist gut.

Es gibt auch einen guten Artikel aufgerufen Camel POOP bei CodeProject.

Ich empfehle einen Blick auf Elche, wenn Sie wollen zu tun OO in Perl.Jedoch, es ist nicht sehr nützlich, wenn Sie nicht verstehen, was OO in Perl bedeutet.Um besser zu verstehen, wie Perl OO arbeitet unter der Haube, schrieb ich eine übersicht auf meinem blog: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/

Von einer Datenstruktur Sicht, ein Objekt, eine Referenz ist mit ein paar extra-features.Der interpreter kennt, die zur Behandlung dieser speziellen Referenzen als Objekte, weil Sie "gesegnet" mit dem Stichwort "segnen".Gesegnet Referenzen enthalten eine Markierung, die angibt, Sie sind ein Objekt.Im wesentlichen bedeutet dies, dass Sie definieren können, und rufen Methoden auf Sie.

Zum Beispiel, wenn Sie einen Basis-hashref, würde dies nicht funktionieren:$hashref->foo();

Aber wenn Sie einen gesegneten hashref (aka ein Objekt) das funktioniert:$blessed_hashref->foo();

Elche ist eine ausgezeichnete Modul für OOP in Perl, weil es schafft eine vollstreckbare OO Schicht UND automatisch verarbeitet accessor-Methoden, so dass Sie nicht haben, um zu definieren, eine Reihe von Getter und setter.Wenn Sie interessiert sind in die Verwendung von Devel::Peak zu sehen, wie der Perl-interpreter speichert Objekte, Folge dem link zum blog-Eintrag, den ich oben gepostet.

Auf einem Fuß, jede Klasse ist ein Paket;schaffen Sie (mehrere, falls gewünscht) die Vererbung durch die Einstellung der Paket-variable @ISA (vorzugsweise zur compile-Zeit);erstellen Sie ein Objekt aus einem vorhandenen Teil der Daten (oft, aber nicht immer, einen anonymen hash, der verwendet zum speichern von Instanz-Variablen) mit segnen(REFERENZ [, CLASSNAME]);rufen Sie Objekt-Methoden wie $obj->methodname(@ARGS) und Klasse Methoden wie "CLASSNAME"->methodname(@ARGS).Mehrfache Vererbung-Methode Auflösung Bestellung kann geändert werden mit mro.

Denn dies ist etwas minimalistisch und nicht zwingen, Kapselung, gibt es viele verschiedene Module, bieten mehr oder andere Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top