Honestamente, no estoy seguro de cuán valioso es el conocimiento de las primitivas OO sin procesar de Perl para escribir código nuevo. No he usado @ISA o "use base" o "bless" en mi código durante mucho tiempo; cualquier OO que hago es a través de Moose MOP. (Yo hago instancias de uso compartido, por supuesto, pero utilizo $ meta-> rebless_instance en lugar de solo "bless". ¡Mucho más limpio!)
De todos modos, me gustaría enseñarte a Moose primero. Es fácil comenzar y ser productivo de inmediato, y puede retomar los detalles a medida que se vuelve más competente en Perl y en la programación en general.
A modo de ejemplo:
#!/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.';
Aviso cómo no hay más lucha con los detalles de la implementación de Perl. Puede preocuparse fácilmente por los detalles de su programa en lugar de cómo hacer OO en Perl. Ni siquiera tiene que hacer un archivo "Point.pm", puede tener la definición de clase en línea.
También creo que este código sería inmediatamente comprensible para casi cualquier programador, incluso aquellos que no estén familiarizados con los detalles de Perl o Moose (o MooseX :: Declare).
(Por cierto, este ejemplo funcionó un poco raro con la sintaxis ":" en las firmas de métodos. Normalmente, obtiene una instancia de usted llamada $ self como primer arg. Si proporciona algo más antes de a: en la firma, puede cambiar el tipo y el nombre de la variable. También escribí "new_from_ordered_pair" para que no tuviera que escribir x => $x, y => $y
como argumentos nuevos cada vez. Esto es solo azúcar que creo que es bueno; nada mágico está sucediendo aquí.)
Finalmente, obtienes mucho aquí "gratis". Pruebe estas opciones, y tomar nota de los mensajes de error votos:
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
Usted consigue todo esto de forma gratuita, y hace que la depuración del programa sea más fácil. No hay razón para evitarlo, realmente hace que la programación sea más agradable (y hace que su programa sea más confiable ... ¡gratis!)
Oh, una cosa más. Con Moose, puedes introspectar tus clases. Esto puede no ser importante de inmediato, pero puede ser bueno tenerlo. Abrir Devel :: REPL, tipo 'hacer "test.pl"' para cargar la clase Point, y luego decir algo como:
map { $_->name } Point->meta->get_all_attributes;
El resultado es ['x', 'y']
. Sin tener el código fuente, puede averiguar qué atributos tiene la clase. Intente hacer eso con Perl OO "simple". (Este tipo de cosas es lo que hace a los ricos MooseX :: espacio de nombres posible. Puede que no necesite la introspección, sino que se disfrutar de la capacidad de utilizar módulos fiables de CPAN.)
El enlace de arriba para "Moose-Unsweetened" no funcionó para mí. Pero http://search.cpan.org/search?query=Moose%3A%3AUnsweetened&mode=all encontró que el Módulo – lexu
arregló el enlace, gracias – perigrin
Creo que quiere decir "no hay razón para NO usar Moose" basado en el siguiente oración en ese párrafo. – mmrobins