Pregunta

Perl tiene funciones de programación orientada a objetos, pero rara vez se utilizan.¿Cómo se crean y utilizan objetos Perl con métodos y propiedades?

¿Fue útil?

Solución

Definitivamente deberías echarle un vistazo 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 le ofrece (entre otras cosas) un constructor, métodos de acceso y verificación de tipos de forma gratuita!

Entonces en tu código puedes:

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 buen punto de partida es Moose::Manual y Moose::Cookbook

Si solo necesitas lo básico, también puedes usar Mouse que no es tan completo, pero sin la mayor parte de la penalización del tiempo de compilación.

Otros consejos

Alce, definitivamente.

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

Inmediatamente, tienes de forma gratuita un método new() y métodos de acceso para los atributos que acabas de definir con 'has'.Entonces, puedes decir:

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

etcétera.No sólo eso, sino que sus métodos de acceso vienen con verificación de tipos de forma gratuita (y puede definir sus propios tipos además de los estándar).Además, obtienes 'extiende' para subclases, 'con' para roles/rasgos y todo tipo de otras cosas geniales que te permiten continuar con el trabajo real de escribir código OO robusto y mantenible.

TMTOWTDI, pero este funciona.

Actualmente uso Objeto::De adentro hacia afuera Siempre que quiero objetos, es bastante agradable y te brindará muchas características sobre los objetos hash bendecidos estándar.Dicho esto, si estuviera comenzando un nuevo proyecto, consideraría seriamente a Moose.

Si bien es bueno leer la documentación oficial de PERL, recomendaría NO Recomiendo intentar implementar su propio marco de objetos, o construir objetos usando hashes, es demasiado tentador tomar el camino fácil y "llegar a su punto máximo" directamente en las variables "privadas" de los objetos, rompiendo completamente la encapsulación, esto volverá en su contra cuando lo desee. para refactorizar el objeto.

Los objetos Perl NO son solo hashes benditos.Son benditas REFERENCIAS.Pueden ser (y la mayoría de las veces lo son) referencias hash bendecidas, pero también podrían ser referencias escalares o de matriz bendecidas.

El tutorial oficial sobre el sitio CPAN es bueno.

También hay un buen artículo llamado CACA de camello en CodeProject.

Recomiendo encarecidamente echar un vistazo a Moose si quieres hacer OO en Perl.Sin embargo, no es muy útil si no entiendes lo que significa OO en Perl.Para comprender mejor cómo funciona Perl OO, escribí una descripción general en mi blog: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-ceived-perl/

Desde el punto de vista de la estructura de datos, un Objeto es una referencia con algunas características adicionales.El intérprete sabe tratar estas referencias especiales como Objetos porque han sido "bendecidos" con la palabra clave "bendecir".Las referencias benditas contienen una bandera que indica que son un Objeto.Básicamente, esto significa que puedes definir y llamar métodos en ellos.

Por ejemplo, si crearas un hashref básico, esto no funcionaría:$hashref->foo();

Pero si creas un hashref bendito (también conocido como un Objeto), esto funciona:$blessed_hashref->foo();

Moose es un excelente módulo para programación orientada a objetos en Perl porque crea una capa de programación orientada a objetos ejecutable Y maneja automáticamente los métodos de acceso para que no tenga que definir un montón de captadores y definidores.Si está interesado en utilizar Devel::Peak para ver cómo el intérprete de Perl almacena objetos, siga el enlace a la entrada del blog que publiqué anteriormente.

Por un lado, cada clase es un paquete;usted establece la herencia (múltiple, si lo desea) configurando la variable del paquete @ES UN (preferiblemente en tiempo de compilación);crea un objeto a partir de un dato existente (a menudo, pero no siempre, un hash anónimo utilizado para almacenar variables de instancia) con bendecir(REFERENCIA [, NOMBRE DE CLASE]);llamas a métodos de objeto como $obj->methodname(@ARGS) y métodos de clase como "CLASSNAME"->methodname(@ARGS).El orden de resolución del método de herencia múltiple se puede modificar usando mro.

Debido a que esto es algo minimalista y no fuerza la encapsulación, hay muchos módulos diferentes que brindan más o diferentes funcionalidades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top