Die objektorientierte Programmierung in Perl entstand nicht sofort – die Sprache war ursprünglich prozedural. OOP wurde durch die Einführung dynamischer Strukturen auf Basis von Hashes und Paketen hinzugefügt. Perl verwendet kein eingebautes Schlüsselwort class wie die meisten anderen Sprachen, sondern arbeitet mit Paketen und dem Blessing von Referenzen.
Die erste Version der Perl-OOP ist einfach ein Paket, das Funktionen exportiert, und eine Datenstruktur (gewöhnlich ein Hash), die über die Funktion bless mit der Zugehörigkeit zum Paket versehen wird. Später kamen CPAN-Module wie Moose/Mouse/Moo hinzu, die eine voll funktionsfähige metale OOP (Metaklassen, Attribute, Rollen) implementieren.
Das Fehlen eines einheitlichen OOP-Musters führt zu einer Vielfalt von Stilen und Inkonsistenzen im OOP-Code zwischen Projekten. Fehler können aufgrund der dynamischen Natur der Sprache auftreten (Fehler in Namen, frühes/spätes Binding, manuelle Manipulationen mit dem bless-Methode).
Beispielcode:
package Animal; sub new { my ($class, %args) = @_; bless { %args }, $class; } sub speak { my $self = shift; print "Das Tier spricht "; } package Cat; our @ISA = ('Animal'); sub speak { my $self = shift; print "Die Katze miaut "; } my $cat = Cat->new(name => 'Barsik'); $cat->speak; # Die Katze miaut
Wesentliche Merkmale:
Was passiert, wenn in new eine nicht bless'ed Referenz, sondern einfach ein Hash zurückgegeben wird?
Die Rückgabe einer nicht-bless'ten Referenz führt dazu, dass nachfolgende Methodenaufrufe über->$obj die Verbindung zum Paket verlieren und die benötigte Methode nicht finden – es tritt ein fataler Fehler auf.
Wie implementiert Perl Mehrfachvererbung und die Lösung von Methoden-Konflikten?
Perl ermöglicht Mehrfachvererbung – im Array @ISA können mehrere Pakete vorhanden sein. Die Methodensuche erfolgt in Breite, von links nach rechts, über alle Eltern. Bei Konflikten wird die erste gefundene Methode genommen.
Kann man in Perl ein Objekt zur Laufzeit "umblessen" (re-bless), und was bedeutet das?
Ja, über bless kann die Zugehörigkeit eines Objekts zu einem anderen Paket während der Ausführung geändert werden. Dies kann verwendet werden, um den "Typ" des Objekts zu ändern. Es besteht jedoch das Risiko einer Inkompatibilität zwischen dem inneren Inhalt des Objekts und den neuen Methoden.
Beispiel:
bless $cat, 'Dog'; # Jetzt verhält sich $cat wie ein Hund!
Im Projekt werden Objekte durch bless eines offensichtlich nicht initialisierten Arrays erstellt, während die Methoden auf eine Referenz auf einen Hash warten. Das Programm stürzt bei jedem Methodenaufruf ab, obwohl die Syntax von Perl es erlaubt, über alles bless zu machen.
Vorteile:
Nachteile:
Die Verwendung von Moose und validierten Konstruktoren, strenge Typisierung von Attributen, automatisches Erstellen von Zugriffs-Methoden, prägnante Beschreibung von Beziehungen zwischen Objekten.
Vorteile:
Nachteile: