2010-01-18 20:46 @907 |
|
|
gaston
Perlero Nuevo
|
Registrado: 2008-01-28 22:16 @969 Mensajes: 7
|
|
|
Interfaces, en Perl
|
|
¡ Hola Perleros !
Hace ya un tiempo que estoy metido en Perl, y ahora, armando un proyecto GPL, me doy cuenta que según la arquitectura que estoy planteando necesito que varias clases implementen una "interfaz" (por ahora estoy planteando una arquitectura genérica, pues no sé si existe esto en perl) como tienen otros lenguajes OOP.
La idea es, por ejemplo, poder decir: "MiClase implements MiInterface".
¿Se puede hacer esto en Perl? Estoy usando el polimorfismo y no quiero que ninguna clase nueva que se agregue deje de tener los métodos que yo les impongo en la Interfaz.
Si no existe... ¿hay manera de emularlo?
Gracias amigos, espero puedan darme una mano. Saludos
Gastón.
|
2010-01-19 02:59 @166 |
|
|
Perl user
Maestro Honorario
|
Registrado: 2004-11-03 21:11 @924 Mensajes: 272
|
|
|
Re: Interfaces, en Perl
|
Échale un vistazo a Moose, en especial a Moose::Role. Antes de Moose, una de las ténicas utilizadas, puesto que Perl soporta "multiple herencia" por medio de @ISA, era declarar "clases abstractas" cuya la implementación de los métodos virtuales o abstractos consiste en simplemente invocar a Carp::croak, con esto indicándole al cliente que debe implementarlos en su clase especializada, de esa manera se definen clases Base. Using perl Syntax Highlighting package Base;
use Carp qw(croak);
sub foo {
croak ("Necesitas implementar este método");
}
package MiClase;
use base 'Base';
sub new { }
sub foo {
# aquí implementación de foo
}
Cómo podrás observar, Perl jamás forzará la verificación de dichos métodos "abstratos" o "virtuales" que defines en tu clase base, sino, lo único que haces es diseñar tu API y permitir que el que implemente la especialización se encargue de dichos métodos. En este caso la recomendación es comentar si es necesario siempre implementarlos todos, o solo algunos. De la misma manera, como tu clase base no cuenta con un constructor, no podrá ser instanciada, pero si alguien invoca uno de los métodos abstractos y no está implementado, por polimorfismo, dicho método será invocado el cual abortará con una llamada a croak. En el caso de usar Moose:Role (o el uso de traits), es que Moose te proveerá de mecanismos de verificación de tipos y otras monerías en las que recomiendo checar el manual y el cookbook.
_________________ Marco A. Manzo
amnesiac@unixmonkeys.com
http://www.unixmonkeys.com/amnesiac/
|
2010-01-19 06:12 @300 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10261
|
|
|
Re: Interfaces, en Perl
|
gaston escribió: ¿Se puede hacer esto en Perl? Depende de la forma de programar que estés usando. En perldoc tienes unos cuantos tutoriales que dan pautas de la programación básica orientada a objetos en Perl. En módulos, hay unos cuantos, como el Class::Interface, tanto para definir clases abstractas como de interfaz. La solución más moderna pasa por programar en Moose (o Mouse). Los interfaces se llaman roles (en Moose::Manual::Concepts). Lo tienes más descrito en Moose::Cookbook en la sección Moose Roles. P.D. (este mensaje tenía que haber salido antes que el de Perl User. Lo siento.)
_________________ JF^D Perl programming
|
2010-01-19 22:32 @980 |
|
|
gaston
Perlero Nuevo
|
Registrado: 2008-01-28 22:16 @969 Mensajes: 7
|
|
|
Re: Interfaces, en Perl
|
|
Amigos: Ante todo, gracias por tomarse un tiempito.
Me han abierto una puerta enorme, ya que desconocía estos módulos.
En estos días probaré las opciones que me recomendaron, y seguramente con esto tengo de sobra para solucionar el inconveniente.
Gracias nuevamente. ¡ Saludos !
Gastón.
|
2010-02-04 15:52 @702 |
|
|
gaston
Perlero Nuevo
|
Registrado: 2008-01-28 22:16 @969 Mensajes: 7
|
|
|
Re: Interfaces, en Perl
|
¡Hola, gente! Bueno, lamento retomar el tema, pero tengo unas dudillas. Estuve tratando de implementar Class::Interface porque me parece más sencillo y no da tantas vueltas como Moose (de todas formas esto lo voy a usar más adelante). La cuestión es que no he podido usar esa clase porque no me funciona. Puntualmente me da este error: " tries to implement non existing interface". Estuve viendo el código y usando tan cual muestran los ejemplos, y nada. Probé varias formas de llamadas (intercambiando las llamadas de lugar solamente) y nada. El ejemplo que usé es el mismo que trae en su PM y tampoco me funciona. ¿Les ha pasado esto alguna vez a ustedes? Si es así y pudieran darme una mano, se los agradecería. La prueba que hice fue: Using perl Syntax Highlighting package Bouncable;
use Class::Interface;
&interface; # this actually declares the interface
sub bounce;
sub getBounceBack;
1;
Using perl Syntax Highlighting package Ball;
use Class::Interface;
&implements( 'Bouncable' );
sub bounce {
my $self = shift;
print "The ball is bouncing @ ".$self->getBounceBack." strength"
}
sub getBounceBack {
return 10;
}
1;
Using perl Syntax Highlighting package AbstractInterestCalculator;
use Class::Interface;
&abstract; # this actually declares this class to be abstract;
use Class::AccessorMaker {
interest => 5.1,
maxInterestValue => 0,
}
# a hook for doing calculations
sub calculate {
my ( $self, $value ) = @_;
$self->prepare();
$value += $self->getInterestValue( $value );
return $value;
}
sub prepare; # prepare calculations
sub getInterstValue; # get the interest value
1;
Using perl Syntax Highlighting package LowInterestCalculator;
use Class::Interface;
&extends( 'AbstractInterestCalculator' );
sub prepare {
my ( $self ) = @_;
$self->interest(1.3);
# we don't give interest if the value of the account is or
# exceeds $10.000
$self->maxInterestValue(10000)
}
sub getInterstValue {
my ( $self, $value ) = @_
if ( $self->maxInterestValue &&
$value >= $self->maxInterestValue ) {
return 0;
}
$value *= $self->interest;
return $value;
}
Lo que pretendo en principio es que no me tire ningún error, luego me centraré en los detalles. Cada archivo lo puse separado con el nombre de su Package con extensión pm. ¡ Gracias ! P.D.: El error que les marqué es uno de ellos, pero si puedo saber por qué me lo tira, resolveré el otro error que es similar.
|
2010-02-07 15:14 @676 |
|
|
gaston
Perlero Nuevo
|
Registrado: 2008-01-28 22:16 @969 Mensajes: 7
|
|
|
Re: Interfaces, en Perl
|
|
¡ Hola Explorer ! Bueno, ante todo, gracias por las molestias.
En efecto, ese es un error, pero no es el error por el cual no me está funcionando.
Aún no lo he podido resolver, pero sigo en carrera. Por ahora, estoy usando 'use base' con llamadas con Carp; mientras, voy a ver si lo resuelvo.
Solamente con el ejemplo de 'package Bouncable' con 'package Ball' (Ball implementa Bouncable) tira el error. Por ahora, el error está cuando está en la función '&interface' de 'Bouncable', y no Ball (cuando hace &implements).
Si logro resolverlo, por lo menos me doy una vuelta por el foro para dejar la solución, así alguien que tenga el mismo problema ya lo tiene resuelto.
Gracias por la ayuda.
¡ Saludos !
|
2010-02-07 18:38 @818 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10261
|
|
|
Re: Interfaces, en Perl
|
A ver... me he instalado la última versión de Class::Interface. Luego, he escrito Bouncable.pm: Using perl Syntax Highlighting package Bouncable;
use Class::Interface;
interface; # this actually declares the interface
sub bounce;
sub getBounceBack;
1;
Ball.pm: Using perl Syntax Highlighting package Ball;
use Class::Interface;
implements( 'Bouncable' );
sub new {
my $class = ref($_[0]) || $_[0]; shift;
return bless( {}, $class );
}
sub bounce {
my $self = shift;
print "The ball is bouncing @ ".$self->getBounceBack." strength\n"
}
sub getBounceBack {
return 10;
}
sub otra {
my $self = shift;
print "Huy\n";
}
1;
Y finalmente, un programa que haga uso de Ball: script.pl: Using perl Syntax Highlighting #!/usr/bin/perl
use Ball;
my $Ball = Ball->new;
$Ball->bounce();
$Ball->otra();
Si ejecuto script.pl, la salida es correcta: Using text Syntax Highlighting The ball is bouncing @ 10 strength
Huy
Ahora bien, si en Bouncable.pm, agregamos Using perl Syntax Highlighting sale: Using text Syntax Highlighting Ball fails to implement otrafuncion from Bouncable at Ball.pm line 4
Compilation failed in require at /home/explorer/Documents/Desarrollo/script.pl line 3.
BEGIN failed--compilation aborted at /home/explorer/Documents/Desarrollo/script.pl line 3. Y nos avisa de que, efectivamente, nos falta por implementar otrafuncion() en Ball.pm.
_________________ JF^D Perl programming
|
|
Página 1 de 1
|
[ 9 mensajes ] |
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|