ProgrammationDéveloppeur Backend Perl

Comment la programmation orientée objet (POO) est-elle mise en œuvre dans Perl ? Décrivez la création et l'utilisation de classes, de constructeurs, de méthodes et des modèles de base d'héritage.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Perl est un langage dynamique qui prend en charge la POO prototype basée sur des hachages et des paquets. Pour créer un objet, on utilise généralement bless :

package Animal; sub new { my ($class, %args) = @_; return bless { %args }, $class; } sub speak { print "Un animal fait un bruit "; } package Dog; use parent 'Animal'; # ou our @ISA = ('Animal') sub speak { print "Woof! "; } my $dog = Dog->new(name => 'Rex'); $dog->speak; # Affichera : Woof!

Ici, le constructeur new crée un hachage avec les données de l'objet et l'associe à la classe. Les méthodes sont déclarées comme des sous-programmes ordinaires. L'héritage est possible via @ISA ou le module parent/base. La POO dans Perl est flexible, mais pas stricte, ce qui ouvre la voie à des possibilités et des subtilités supplémentaires.

Question piège

Comment mieux réaliser des propriétés/méthodes privées d'un objet en Perl, compte tenu de l'absence de syntaxe private/protected ?

Réponse : Il n'y a pas de mécanisme intégré, cependant, la confidentialité est atteinte grâce aux variables lexicales en dehors du paquet ou des conventions de nommage (_private). Par exemple :

package Car; my $secret = 'hidden'; # privé pour le paquet sub _private { ... } # convention : ne pas appeler de l'extérieur

Cette approche ne protège pas contre l'accès, mais est considérée comme la norme.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


Histoire

Un objet contenant un tableau de références à d'autres objets a été défini dans un projet. Les développeurs oubliaient d'appeler les méthodes comme $obj->method, les appelant comme method($obj), ce qui entraînait des résultats inattendus, en particulier lors de l'héritage et de la redéfinition des méthodes – la classe était mal définie, et les méthodes parentales étaient appelées au lieu des méthodes enfants.


Histoire

L'utilisation d'une variable de paquet au lieu d'une variable lexicale pour stocker l'état de l'objet a conduit à ce qu'un changement d'état soit reflété dans tous les exemplaires de la classe, car les données étaient communes et non individuelles à l'objet.


Histoire

Le travail implicite avec la variable @ISA pour l'héritage, lors du chargement dynamique des classes, dans de grands projets a conduit à ce que les listes de parents ne soient pas mises à jour à temps, et le programme perdait soudainement des méthodes ou obtenait une hiérarchie incorrecte.