Honnêtement, je ne suis pas sûr de la façon de précieuses connaissances de Perl raw OO primitives est pour l'écriture de nouveaux codes plus. Je n'ai pas utilisé @ISA ou "utilisation de base" ou de "bénir" dans mon code pour un temps très long; tout OO je fais, c'est via l'Orignal MOP. (Je ne rebless cas, bien sûr, mais j'utilise $meta->rebless_instance au lieu de "bénir". Beaucoup plus propre!)
De toute façon, je voudrais vous enseigner l'Orignal en premier. Il est facile à prendre en main et d'obtenir immédiatement productifs, et vous pouvez ramasser les détails que vous devenez plus compétent en Perl et la programmation en général.
À titre d'exemple:
#!/usr/bin/env perl
use strict;
use warnings;
use feature ':5.10'; # for 'say'
use MooseX::Declare;
class Point {
has [qw/x y/] => ( is => 'ro', isa => 'Num', required => 1 );
method new_from_ordered_pair(ClassName $class: Num $x, Num $y){
return $class->new( x => $x, y => $y );
}
method distance(Point $a: Point $b){
return sqrt( ($a->x - $b->x)**2 + ($a->y - $b->y)**2 );
}
}
my $origin = Point->new_from_ordered_pair(0,0);
my $point = Point->new_from_ordered_pair(3,4);
say '(3,4) is '. $point->distance($origin). ' units away from the origin.';
Remarquez comment il n'y a pas plus de combats avec les détails de Perl à la mise en œuvre. Vous pouvez facilement soucier des détails de votre programme à la place de comment faire de l'OO en Perl. Vous n'avez même pas à faire un "Point.h" du fichier, vous pouvez avoir la définition de la classe en ligne.
Je pense également que ce code serait immédiatement compréhensible pour presque n'importe quel programmeur -- même ceux qui ne sont pas familiers avec les détails de Perl ou de l'Orignal (ou MooseX::Déclarer).
(BTW, cet exemple a travaillé un peu bizarrement avec les ":" la syntaxe dans les signatures de méthode. Normalement, vous obtenez une instance de vous-même, appelée $à soi-même comme le premier arg. Si vous fournissez quelque chose d'autre avant un : dans la signature, vous pouvez modifier le type et le nom de la variable. J'ai aussi écrit "new_from_ordered_pair", de sorte que vous ne voudriez pas avoir à taper x => $x, y => $y
que les arguments nouveaux à chaque fois. C'est juste un peu de sucre que je pense est agréable, rien de magique qui se passe ici.)
Enfin, vous obtenez beaucoup ici "gratuitement". Les essayer, et notez les messages d'erreur utiles:
Point->new; # x is required
Point->new_from_ordered_pair('foo', 'bar'); # x needs to be a number
$point->distance('some string'); # $b needs to be a Point
Vous obtenez tout cela pour gratuit, et il permet de déboguer votre programme plus facile. Il n'y a pas de raison pour l'éviter, il rend la programmation plus agréable (et cela rend votre programme plus fiable... gratuitement!)
Oh, encore une chose. Avec l'Orignal, vous pouvez connaître le fonctionnement de votre classe. Cela peut ne pas être important, tout de suite, mais il peut être agréable d'avoir. Ouvrir Devel::REPL, de type " faire "test.pl" " pour charger la classe Point, et puis dire quelque chose comme:
map { $_->name } Point->meta->get_all_attributes;
Le résultat est ['x', 'y']
. Sans avoir le code source, vous pouvez savoir quels sont les attributs de la classe. Essayez de faire ça avec "la plaine" OO Perl. (Ce genre de chose est ce qui rend les riches MooseX:: espace de noms possibles. Vous ne pourriez pas besoin d'introspection, mais vous permettra de profiter de la possibilité d'utiliser des modules fiables sur le CPAN.)