[Perl] POO en Perl
Salvador Ortiz Garcia
sog@msg.com.mx
Fri, 08 Aug 2003 05:35:13 -0500
On Thu, 2003-08-07 at 19:14, Pablo Fischer wrote:
> Que tal!
>
> Aunque ya llevo muchas clases (de haber aprendido de Manuales, ejemplos,
> etc..etc) he llegado a una pregunta, que posiblemente se confunda cualquier
> persona que viene de un lenguaje tipo C++/Java/C#, que son los métodos,
> públicos o privados (e incluso hasta protegidos, pero no voy por ahí).
>
> En todos mis métodos cuando necesito usar otro lo hago de esta manera
>
> $valor = $this->met("argumento1");
>
> Y en el método 'met' tengo lo siguiente:
>
> sub met {
> my $this = shift;
> my $nombre = $_[0];
>
> Bla bla bla bla...
>
> return $unavariable;
> }
>
> Pero es necesario llamar así a los métodos cuando solamente sirven para
> transformar un string a otro formato o hacer un cálculo?, Es decir, porque no
> hacer esto
>
> $valor = &met("argumento1");
> sub met {
> my $nombre = $_[0];
>
> Bla bla bla bla...
>
> return $unavariable;
> }
>
> Y de esta manera ese método (met) no pueda accesar desde afuera de la propia
> clase (privado).
>
> Es obvio de que en 'met' no voy a usar ningún valor de $this (algo así como
> $this->{DATO}), simplemente necesito un argumento y de ahí me las arreglo, o
> bien, abrir una rchivo (que se lo paso por agumento), buscar un dato y listo,
> devolver ese dato.
>
> Que tan necesario es $this para los métodos privados.
Tan necesario como que sin tu $this ya no son métodos!
Pero además no importa!
Pero mejor me explico:
Para horror de los puristas de la POO Perl _no_ pretende atarte al
paradigma.
Tu puedes, si y sólo si lo deseas, usar los paradigmas de la POO en las
partes de tu sistema/programa/script en que los necesites/se_te_antoje y
no usarlos en donde no. Más aun, puedes modificarlos a tu conveniencia
de programador.
En el caso que comentas, por principio de cuentas en Perl no existe
diferencia sintáctica alguna entre la declaración de una función común y
corriente y un "metodo".
Y de hecho cualquiera de los metodos de una clase puede ser invocado
como función simple e incluso desde afuera de la clase.
Un ejemplo:
package Foo::Bar;
sub new { # Obviamente un constructor
return bless {}, ref($_[0]) || $_[0];
}
sub setA { # Obviamente un método
$_[0]->{A} = $_[1];
}
sub getA { # Otro método
return $_[0]->{A};
}
sub otrogetA { # Otro método
return $_[0]->getA
}
# Fin de la clase Foo::Bar;
package main;
# Puedo jugar con las reglas
my $obj = new Foo::Bar;
$obj->setA('hola');
print $obj->getA; # Funciona
# Pero nada me impide hacer
my $variable; # Ni siquiera la inicializo
Foo::Bar::setA($variable, 'adios');
print Foo::Bar::getA($variable); # Funciona!
De lo anterior queda claro que la diferencia en Perl entre un metodo y
una vil función es cómo la usas.
Lo importante en realidad es lo que recibe como primer argumento, pues
mientras usando el código de arriba
print $obj->otrogetA; # Funciona,
print Foo::Bar::otrogetA($variable); # NO funciona
Y ya no hablemos de métodos "privados".
Saludos.
--
Salvador Ortiz Garcia <sog@msg.com.mx>
Matías Software Group