In Perl worden objecten geïmplementeerd via "blessing" van verwijzingen naar standaard datastructuren (arrays, hashes, scalars). Historisch gezien is OOP in Perl gebaseerd op het aanspreken van een hash, waarbij de sleutels de namen van attributen zijn en de waarden de gegevens zelf. Deze benadering biedt flexibiliteit, maar vereist discipline: de taal biedt geen strikte encapsulatie en toegangsmodifiers — alles is gebaseerd op afspraken.
Probleem: Zonder expliciete beperkingen is toegang tot attributen mogelijk vanuit elke code; het is gemakkelijk om de invarianties van een object te breken, de namespace te verwarren of een fout te maken in de overerving.
Oplossing — volg strikt de afspraken: verberg interne gegevens via een overeenkomst (bijvoorbeeld met onderstrepingen), gebruik waar mogelijk accessor-methoden en pas voor complexe taken standaardmodules zoals Moose, Moo, Class::Accessor, enz.
Voorbeeldcode:
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;
Belangrijkste kenmerken:
Kun je een Perl-object maken zonder gebruik van bless?
Antwoord: Nee, alleen bless verandert een gewone verwijzing in een object dat door de methode -> begrepen wordt.
Waarom zijn base/parent nodig en wat is het verschil met @ISA?
Antwoord: @ISA is een array die naar basisclasses verwijst. base/parent automatiseren het werken met @ISA en maken het overerven van modules veiliger: ze voorkomen dubbele overerving en bieden extra controles.
Vervangt een afgeleide klasse methoden van de ouderklasse als ze zijn gedefinieerd met dezelfde naam?
Antwoord: Ja, als in de afgeleide klasse een methode met dezelfde naam is gedefinieerd, wordt die eerst gekozen door '->' — klassieke "method overriding" werkt hier.
In de module Animal worden gegevens opgeslagen in open attributen, die direct worden aangesproken. Iemand verandert onbewust de waarde van een veld van buitenaf — het object gaat in een inconsistente staat.
Voordelen:
Nadelen:
De module gebruikt accessors, alle interne velden beginnen met _, er is een duidelijke specificatie — alleen via get/set-methoden wordt met gegevens gewerkt, er zijn controles toegevoegd in set.
Voordelen:
Nadelen: