|
Sull'ultimo numero di TPJ ho letto, e trovato piuttosto interessante, un articolo su ObjectivePerl. Questo modulo permette di utilizzare la sintassi di Objective C (o almeno qualcosa che le somigli) nella definizione e nell'utilizzo degli oggetti in Perl. Di fatto altro non è un wrapper che converte la sintassi ObjectivePerl in quella standard Perl.
In effetti, ed ora penso verrò fucilato, ho sempre trovato un po' bizzarra la sintassi dell'OOP in Perl, soprattutto per quanto concerne le variabili d'istanza e la definizione delle classi stesse. Per quanto io non sappia praticamente nulla di Objective C (e, da quanto ho visto, è un peccato) , ho cercato di utilizzare questo modulo. Mi è anche uscito fuori un po' di codice.
#!/usr/local/bin/perl
use strict;
use ObjectivePerl;
@implementation Strega
{
@private: $anni;
@protected: $grido;
}
+ new {
return ~[$super new];
}
- anni {
return $anni;
}
- grida {
return $grido;
}
- setGrido: $sGrido {
$grido = $sGrido;
}
+ info {
return "Sono una strega!";
}
@end
La classe viene definita con @implementation, e subito sotto ad essa si possono indicare le variabili d'istanza, che possono essere private o protette: questa è una simpatica novità rispetto alla sintassi standard di Perl, che non permette delle vere e proprie variabili d'istanza, ma obbligata all'utilizzo di qualcosa tipo $self->{'grido'}.
Un'altra novità è rapprentata dalla possibilità di definire sia metodi statici che metodi d'istanza: i primi si definiscono utilizzano +, i secondi servendosi di -.
Ho anche scritto una classe Amelia, figlia della Strega appena definita:
@implementation Amelia : Strega
{
@protected: $pianto;
}
- piangi {
return $pianto;
}
- setPianto: $sPianto {
$pianto = $sPianto;
}
+ info {
return "Voglio derubare Zio Paperone!";
}
@end
Anche per quanto riguarda l'ereditarietà la sintassi è dunque piuttosto chiara e lineare, in perfetto stile Objective C. Ecco invece il codice che utilizza le classi sopra definite:
# Crea una strega
my $st = ~[Strega new];
~[$st setGrido: "He he he"];
print ~[$st grida]."\n";
# Crea Amelia
my $am = ~[Amelia new];
~[$am setPianto: "Sniff!"];
print ~[$am piangi]."\n";
Al di là della diversa sintassi, c'è una variazioni fondamentale rispetto a Perl standard: vengono utilizzati i messaggi anziché le chiamate ai metodi. Ciò crea alcune differenze: un oggetto può rispondere oppure no ad un messaggio, e chiaramente se viene inviato un messaggio non esistente non accade nulla. Cioè, utilizzando la sintassi Objective Perl, non viene sollevato alcun errore se si chiama un metodo inesistente.
Secondo l'autore di ObjectivePerl, l'overhead del modulo è molto basso, ed il suo utilizzo non mina dunque le performance dei propri programmi. In futuro verranno aggiunte altre cose, quali i protocols, ed il livello di visibilità (pubblico, privato, protetto) anche per i moduli.
Personalmente, trovo un tantino scomodo che quanto segue non funzioni:
@implementation Sasso
{
@protected: $minerale;
}
+ new {
my $self = ~[$super new];
$minerale = "Basalto";
return $self;
}
L'assegnazione di $minerale dà errore, poiché le variabili d'istanza non risultano accessibili dal costruttore, nemmeno dopo aver inizializzato la classe genitore.
Penso che ci studierò ancora un po' sopra, vediamo cosa ne esce. Leggendo la draft di questo articolo, Larsen mi ha fatto inoltre notare che sarebbe interessante mostrare nel dettaglio come i costrutti linguistici dell'Objective C assenti in Perl vengono resi grazie a questo modulo. Visto che io di Objective C non so molto (leggi: non so nulla), magari qualcuno vuole fornire il suo contributo... ;-)
Inviato da arthas il 10.10.04 23:55
Ti è piaciuto questo articolo? Iscriviti al feed!
|