Domanda

Perl ha funzionalità OOP, ma sono usate piuttosto raramente.Come crei e usi oggetti Perl con metodi e proprietà?

È stato utile?

Soluzione

Dovresti assolutamente dare un'occhiata Moose.

package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

Moose ti offre (tra le altre cose) un costruttore, metodi di accesso e controllo del tipo gratuitamente!

Quindi nel tuo codice puoi:

my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15);     # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5);   # FAILS! Free type check.

Un buon punto di partenza è Moose::Manual E Moose::Cookbook

Se hai solo bisogno delle cose di base, puoi anche usarle Mouse che non è così completo, ma senza la maggior parte della penalità in termini di tempo di compilazione.

Altri suggerimenti

Alce, decisamente.

package Person;
use Moose;
has age => ( isa => Int, is => 'rw'); 
has name => ( isa => Str, is => 'rw'); 
1;

Immediatamente, hai gratuitamente un metodo new() e metodi di accesso per gli attributi che hai appena definito con 'has'.Quindi, puoi dire:

my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";

e così via.Non solo, ma i tuoi metodi di accesso vengono controllati gratuitamente (e puoi definire i tuoi tipi oltre a quelli standard).Inoltre ottieni "estende" per sottoclassi, "con" per ruoli/tratti e ogni sorta di altre fantastiche cose che ti consentono di andare avanti con il vero lavoro di scrivere un buon codice OO robusto e manutenibile.

TMTOWTDI, ma questo funziona.

Attualmente utilizzo Oggetto::InsideOut ogni volta che voglio oggetti, è piuttosto carino e ti darà molte funzionalità rispetto agli oggetti hash benedetti standard.Detto questo, se dovessi iniziare un nuovo progetto prenderei seriamente in considerazione Moose.

Anche se è bene leggere la documentazione ufficiale PERL, lo farei NON consiglia di provare a interpretare il proprio framework di oggetti o a costruire oggetti utilizzando gli hash, è lontano dalla tentazione di prendere la strada facile e "piccare" direttamente nelle variabili "private" degli oggetti rompendo completamente l'incapsulamento, questo tornerà a morderti quando vuoi per rifattorizzare l'oggetto.

Gli oggetti Perl NON sono solo hash benedetti.Sono benedetti RIFERIMENTI.Possono essere (e molto spesso lo sono) riferimenti hash benedetti, ma potrebbero altrettanto facilmente essere riferimenti scalari o ad array benedetti.

Il tutorial ufficiale su Sito CPAN è buono.

C'è anche un buon articolo chiamato CACCA DI CAMMELLO presso CodeProject.

Consiglio vivamente di dare un'occhiata a Moose se vuoi fare OO in Perl.Tuttavia, non è molto utile se non capisci cosa significa OO in Perl.Per comprendere meglio come funziona Perl OO, ho scritto una panoramica sul mio blog: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-orientato-perl/

Dal punto di vista della struttura dei dati, un Oggetto è un riferimento con alcune funzionalità extra.L'interprete sa trattare questi riferimenti speciali come Oggetti perché sono stati "benedetti" con la parola chiave "benedire".I riferimenti benedetti contengono un flag che indica che sono un oggetto.Essenzialmente questo significa che puoi definire e chiamare metodi su di essi.

Ad esempio, se creassi un hashref di base, questo non funzionerebbe:$hashref->foo();

Ma se crei un hashref benedetto (noto anche come oggetto) funziona:$blessed_hashref->foo();

Moose è un modulo eccellente per l'OOP in Perl perché crea uno strato OO applicabile E gestisce automaticamente i metodi di accesso in modo da non dover definire un mucchio di getter e setter.Se sei interessato a utilizzare Develop::Peak per vedere come l'interprete Perl memorizza gli oggetti, segui il collegamento al post sul blog che ho pubblicato sopra.

Da un lato ogni classe è un pacchetto;si stabilisce l'ereditarietà (multipla, se lo si desidera) impostando la variabile del pacchetto @È UN (preferibilmente in fase di compilazione);crei un oggetto da un dato esistente (spesso, ma non sempre, un hash anonimo utilizzato per memorizzare variabili di istanza) con benedire(RIFERIMENTO [, NOMECLASSE]);si chiamano metodi oggetto come $obj->methodname(@ARGS) e metodi di classe come "CLASSNAME"->methodname(@ARGS).L'ordine di risoluzione del metodo di ereditarietà multipla può essere modificato utilizzando signor.

Poiché questo è alquanto minimalista e non forza l'incapsulamento, esistono molti moduli diversi che forniscono funzionalità più o diverse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top