Dans Perl, les objets sont réalisés via le "blessing" des références aux structures de données standard (tableaux, hash, scalaires). Historiquement, la POO dans Perl repose sur l'accès à un hash, où les clés sont les noms des attributs et les valeurs sont les données elles-mêmes. Cette approche offre de la flexibilité, mais exige de la discipline : le langage ne met pas en œuvre une encapsulation stricte et des modificateurs d'accès — tout repose sur des conventions.
Problème : Sans restrictions explicites, l'accès aux attributs est possible depuis n'importe quel code ; il est facile de rompre les invariants de l'objet, de confondre les espaces de noms, de faire une erreur d'héritage.
Solution — suivre strictement les conventions : cacher les données internes via une convention (par exemple, des traits de soulignement), utiliser autant que possible des méthodes d'accès, et pour des tâches complexes, utiliser des modules standard comme Moose, Moo, Class::Accessor, etc.
Exemple de code :
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 "Woof! "; } my $dog = Dog->new("Buddy"); print $dog->get_name; $dog->bark;
Caractéristiques clés :
Peut-on créer un objet Perl sans utiliser bless ?
Réponse : Non, seul bless transforme une référence classique en objet, compris par la méthode ->
Pourquoi utiliser base/parent et quelle est la différence avec @ISA ?
Réponse : @ISA est un tableau qui indique les classes de base. base/parent automatisent le travail avec @ISA et rendent l'héritage des modules plus sûr : elles préviennent l'héritage multiple et fournissent des vérifications supplémentaires.
Un sous-classe écrasera-t-elle les méthodes de la classe parente si elles sont définies avec le même nom ?
Réponse : Oui, si une méthode est définie avec le même nom dans la sous-classe, '->' la choisira en premier — cela fonctionne sur le principe classique de "méthode de surcharge".
Dans le module Animal, les données sont stockées dans des attributs publics, auxquels on accède directement. Quelqu’un modifie involontairement la valeur d’un champ depuis l’extérieur — l’objet passe à un état inconsistant.
Avantages :
Inconvénients :
Le module utilise des accesseurs, tous les champs internes commencent par _, il y a une spécification claire — le travail avec les données se fait uniquement via des méthodes get/set, des vérifications sont ajoutées dans set.
Avantages :
Inconvénients :