Question

Perl possède des fonctionnalités POO, mais elles sont assez rarement utilisées.Comment créer et utiliser des objets Perl avec des méthodes et des propriétés ?

Était-ce utile?

La solution

Tu devrais absolument y jeter un oeil 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 vous offre (entre autres) un constructeur, des méthodes d'accès et une vérification de type gratuitement !

Donc dans ton code tu peux :

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 bon point de départ est Moose::Manual et Moose::Cookbook

Si vous avez juste besoin des éléments de base, vous pouvez également utiliser Mouse ce qui n'est pas aussi complet, mais sans la majeure partie de la pénalité de temps de compilation.

Autres conseils

Élan, certainement.

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

Immédiatement, vous disposez gratuitement d'une méthode new() et de méthodes d'accès pour les attributs que vous venez de définir avec 'has'.Ainsi, vous pouvez dire :

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

et ainsi de suite.Non seulement cela, mais vos méthodes d'accès sont vérifiées gratuitement (et vous pouvez définir vos propres types ainsi que les types standard).De plus, vous obtenez « étend » pour les sous-classes, « avec » pour les rôles/traits et toutes sortes d'autres choses intéressantes qui vous permettent de vous consacrer au vrai travail d'écriture d'un bon code OO robuste et maintenable.

TMTOWTDI, mais celui-ci fonctionne.

Actuellement j'utilise Objet :: InsideOut chaque fois que je veux des objets, c'est plutôt sympa et vous donnera de nombreuses fonctionnalités par rapport aux objets de hachage bénis standard.Cela dit, si je démarrais un nouveau projet, je regarderais sérieusement Moose.

Bien qu'il soit bon de lire la documentation officielle PERL, je voudrais PAS recommandez d'essayer de jouer le rôle de votre propre cadre d'objets, ou de construire des objets à l'aide de hachages, c'est loin d'être tentant de prendre la voie facile et de "picer" directement dans les variables "privées" des objets, brisant complètement l'encapsulation, cela reviendra vous mordre quand vous le souhaitez pour refactoriser l'objet.

Les objets Perl ne sont PAS de simples hachages bénis.Ce sont des RÉFÉRENCES bénies.Ils peuvent être (et sont le plus souvent) des références de hachage bénies, mais ils pourraient tout aussi bien être des références scalaires ou de tableau bénies.

Le tutoriel officiel sur le Site du CPAN est bon.

Il y a aussi un bon article intitulé Caca de chameau chez CodeProject.

Je recommande fortement de jeter un œil à Moose si vous souhaitez faire de l'OO en Perl.Cependant, ce n'est pas très utile si vous ne comprenez pas ce que signifie OO en Perl.Pour mieux comprendre comment Perl OO fonctionne sous le capot, j'ai écrit un aperçu sur mon blog : http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/

Du point de vue de la structure des données, un Objet est une référence avec quelques fonctionnalités supplémentaires.L'interprète sait traiter ces références spéciales comme des Objets car elles ont été « bénies » avec le mot-clé « bénir ».Les références bénies contiennent un drapeau indiquant qu'elles sont un objet.Essentiellement, cela signifie que vous pouvez définir et appeler des méthodes sur eux.

Par exemple, si vous créez un hashref de base, cela ne fonctionnera pas :$hashref->foo();

Mais si vous créez un hashref béni (c'est-à-dire un objet), cela fonctionne :$blessed_hashref->foo();

Moose est un excellent module pour la POO en Perl car il crée une couche OO exécutable ET gère automatiquement les méthodes d'accès afin que vous n'ayez pas à définir un tas de getters et de setters.Si vous souhaitez utiliser Devel :: Peak pour voir comment l'interpréteur Perl stocke les objets, suivez le lien vers l'entrée de blog que j'ai publiée ci-dessus.

Sur un pied, chaque classe est un paquet ;vous établissez un héritage (multiple, si vous le souhaitez) en définissant la variable du package @EST UN (de préférence au moment de la compilation) ;vous créez un objet à partir d'une donnée existante (souvent, mais pas toujours, un hachage anonyme utilisé pour stocker des variables d'instance) avec bénir(RÉFÉRENCE [, NOM DE CLASSE]);vous appelez des méthodes d'objet comme $obj->methodname (@ARGS) et des méthodes de classe comme "CLASSNAME"->methodname (@ARGS).L'ordre de résolution de plusieurs méthodes d'héritage peut être modifié à l'aide de mro.

Parce que cela est quelque peu minimaliste et ne force pas l'encapsulation, il existe de nombreux modules différents qui fournissent des fonctionnalités plus nombreuses ou différentes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top