In Perl, gli oggetti sono implementati tramite "blessing" riferimenti a strutture dati standard (array, hash, scalari). Storicamente, la OOP in Perl si basa sull'accesso a un hash, dove le chiavi sono i nomi degli attributi e i valori sono i dati stessi. Questo approccio offre flessibilità, ma richiede disciplina: il linguaggio non implementa un incapsulamento rigoroso e modificatori di accesso - tutto si basa su convenzioni.
Problema: Senza restrizioni esplicite, l'accesso agli attributi è possibile da qualsiasi codice; è facile rompere le invarianti di un oggetto, confondere lo spazio dei nomi, commettere errori nell'ereditarietà.
Soluzione - seguire rigorosamente le convenzioni: nascondere i dati interni attraverso convenzioni (ad esempio, utilizzando underscore), se possibile, utilizzare metodi accessor e, per compiti complessi, applicare moduli standard come Moose, Moo, Class::Accessor, ecc.
Esempio di codice:
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;
Caratteristiche principali:
È possibile creare un oggetto Perl senza utilizzare bless?
Risposta: No, solo bless trasforma un normale riferimento in un oggetto comprensibile dal metodo ->
A cosa servono base/parent e qual è la differenza con @ISA?
Risposta: @ISA è un array che indica le classi base. base/parent automatizzano il lavoro con @ISA e rendono più sicura l'ereditarietà dei moduli: prevengono l'ereditarietà doppia e forniscono controlli aggiuntivi.
Un classe figlia sovrascriverà i metodi della classe genitore se sono definiti con lo stesso nome?
Risposta: Sì, se nella classe figlia è definito un metodo con lo stesso nome, '->' sceglierà prima quello - funziona il classico "method overriding".
Nel modulo Animal, i dati sono memorizzati in attributi aperti, ai quali si accede direttamente. Qualcuno cambia inconsapevolmente il valore di un campo dall'esterno - l'oggetto entra in uno stato inconsistente.
Vantaggi:
Svantaggi:
Il modulo utilizza accessor, tutti i campi interni iniziano con _, c'è una chiara specifica - il lavoro con i dati avviene solo attraverso metodi get/set, sono state inserite verifiche in set.
Vantaggi:
Svantaggi: