En Perl, los objetos se implementan a través de "blessing" referencias a estructuras de datos estándar (arreglos, hashes, escalares). Históricamente, la POO en Perl se basa en el acceso a un hash, donde las claves son los nombres de los atributos y los valores son los propios datos. Este enfoque proporciona flexibilidad, pero requiere disciplina: el lenguaje no implementa una encapsulación estricta y modificadores de acceso, todo se basa en convenciones.
Problema: Sin restricciones claras, el acceso a los atributos es posible desde cualquier código; es fácil romper invariantes del objeto, confundir el espacio de nombres, cometer errores en la herencia.
Solución — seguir estrictamente las convenciones: ocultar datos internos mediante convenciones (por ejemplo, utilizando guiones bajos), usar métodos accessor cuando sea posible, y para tareas complejas, aplicar módulos estándar como Moose, Moo, Class::Accessor, etc.
Ejemplo de código:
package Animal; sub new { my $class = shift; my $self = { _name => shift }; bless $self, $class; return $self; } sub get_name { $_[0]->{_name} } package Dog; use parent 'Animal'; sub bark { print "¡Guau! "; } my $dog = Dog->new("Buddy"); print $dog->get_name; $dog->bark;
Características clave:
¿Se puede crear un objeto Perl sin usar bless?
Respuesta: No, solo bless convierte una referencia ordinaria en un objeto que es entendido por el método ->
¿Para qué sirven base/parent y cuál es la diferencia con @ISA?
Respuesta: @ISA es un arreglo que indica las clases base. base/parent automatizan el trabajo con @ISA y hacen que la herencia de módulos sea más segura: previenen la herencia múltiple y ofrecen verificaciones adicionales.
¿Sobrescribirá una clase hija métodos de la clase padre si están definidos con el mismo nombre?
Respuesta: Sí, si en la clase hija se define un método con el mismo nombre, '->' elegirá este primero — funciona el clásico "method overriding".
En el módulo Animal, los datos se almacenan en atributos públicos, a los que se accede directamente. Alguien podría cambiar inadvertidamente el valor de un campo desde fuera — el objeto pasa a un estado inconsistente.
Ventajas:
Desventajas:
El módulo utiliza accessors, todos los campos internos comienzan con _, hay una especificación clara — solo se trabaja con los datos a través de métodos get/set, se han implementado verificaciones en set.
Ventajas:
Desventajas: