[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