In Perl werden Objekte durch das "blessing" von Referenzen auf standardisierte Datentypen (Arrays, Hashes, Skalare) realisiert. Historisch basiert die OOP in Perl auf dem Zugriff auf Hashes, wobei die Schlüssel die Namen der Attribute und die Werte die eigentlichen Daten sind. Dieser Ansatz bietet Flexibilität, erfordert jedoch Disziplin: Die Sprache implementiert keine strenge Kapselung und Zugriffsmodifizierer – alles basiert auf Konventionen.
Problem: Ohne explizite Einschränkungen ist der Zugriff auf Attribute aus jedem Code möglich; es ist leicht, Invarianten des Objekts zu brechen, Namensräume zu verwechseln oder Fehler in der Vererbung zu machen.
Lösung — striktes Befolgen der Konventionen: interne Daten durch Konvention (z. B. Unterstriche) verstecken, soweit möglich accessor-Methoden verwenden und für komplexe Aufgaben die Standardmodule Moose, Moo, Class::Accessor usw. verwenden.
Beispielcode:
package Animal; sub new { my $class = shift; my $self = { _name => shift }; bless $self, $class; return $self; } sub get_name { $_[0]->{_name} } package Dog; use parent 'Animal'; sub bark { print "Woof! "; } my $dog = Dog->new("Buddy"); print $dog->get_name; $dog->bark;
Wesentliche Merkmale:
Kann man ein Perl-Objekt ohne Verwendung von bless erstellen?
Antwort: Nein, nur bless verwandelt eine normale Referenz in ein Objekt, das durch die Methode -> verstanden wird.
Was ist der Zweck von base/parent und was ist der Unterschied zu @ISA?
Antwort: @ISA ist ein Array, das auf Basisklassen verweist. base/parent automatisieren die Arbeit mit @ISA und machen die Vererbung von Modulen sicherer: verhindern Mehrfachvererbung und bieten zusätzliche Prüfungen.
Überschreibt eine Kindklasse die Methoden der Elternklasse, wenn sie mit demselben Namen definiert sind?
Antwort: Ja, wenn in der Kindklasse eine Methode mit demselben Namen definiert ist, wird '->' sie zuerst auswählen — das klassische "method overriding" funktioniert.
Im Modul Animal werden Daten in offenen Attributen gespeichert, auf die direkt zugegriffen wird. Jemand verändert unbewusst den Wert eines Feldes von außen — das Objekt gerät in einen inkonsistenten Zustand.
Vorteile:
Nachteile:
Das Modul verwendet Accessoren, alle internen Felder beginnen mit _, es gibt eine klare Spezifikation — die Arbeit mit Daten erfolgt ausschließlich über get/set-Methoden, Prüfungen sind in set eingebaut.
Vorteile:
Nachteile: