Style de programmation en Perl

9

Je travaille en Java, donc en gros j'utilise le paradigme OOP lors du codage. Je suis sur le point de commencer à travailler en Perl et je me demandais quel est le paradigme que les développeurs Perl suivent. Dans wiki, il mentionne qu'il prend en charge de nombreux paradigmes, mais je ne suis pas sûr de comprendre cela, car il s'agit d'un langage de script.

Ma question est donc la suivante: les modèles orientés objet que je connais en Java sont-ils idiomatiques en Perl, ou aurai-je besoin de modifications importantes de mon style de conception pour écrire en Perl efficace?

Remarque: Il ne s'agit pas de critiquer Perl. En fait, je dois travailler en Perl et j'aimerais comprendre comment la façon dont je programme va changer.

user10326
la source
3
Sur une note plus sérieuse, effectuez une recherche Google sur "philosophie perl" et jetez un œil ici: perldesignpatterns.com
Robert Harvey
Perl prend en charge la POO. Vous pouvez créer des hiérarchies de classes, implémenter des fonctions virtuelles, etc. Ce n'est pas l'utilisation la plus courante mais cela peut être fait.
Martin York
"puisqu'il s'agit d'un langage de script" - il peut être utilisé comme tel, mais rappelez-vous que perl est autant une machine virtuelle que Java - perl est compilé (à la volée) en bytecode qui est ensuite exécuté. Il n'y a pas de JIT, mais à part ça, c'est toujours une machine virtuelle exécutant votre code.
Tanktalus

Réponses:

15

La philosophie de Perl tend à être celle de «faire ce qui est pratique maintenant». Si vous devez utiliser la POO, c'est là. Il n'est pas nécessaire dans toutes les solutions et forcer une personne à écrire du code POO quand il s'agit d'un simple problème de type "faites ceci puis ceci alors ce" est souvent contre-productif.

La nature multi-paradigme de perl peut être vue dans des choses telles que la transformation schwartzienne qui a des aspects très fonctionnels (en Lisp, elle est connue comme "décorer-trier-décorer"). La POO existe, de même que procédurale (programmation comme C) et impérative (bash comme "faites ceci puis ceci").

Les modèles de conception sont des solutions récurrentes aux problèmes courants. Ils existent dans toutes les langues. Parfois, ces modèles sont appelés idiomes, bien que cela puisse également se référer à des choses beaucoup plus simples qu'un modèle.

Si nécessaire, la plupart des modèles de conception GOF classiques peuvent être implémentés en perl. Perl Design Patterns aura de nombreux noms communs que les gens familiers avec le GOF. Il n'est pas nécessaire que tous soient des perl idiomatiques.

Lorsque vous explorez des modèles de conception en perl, veuillez également prendre note des «modèles de conception» ne sont pas de Mark Dominus .

Beaucoup considèrent que les modèles de conception sont des lacunes dans la langue . Dans cette perspective, les modèles de conception tels que l'itérateur sont souvent inutiles en perl. Pas toujours - mais souvent.

Tout d'abord, écrivez perl idiomatique. N'essayez pas d'écrire C en perl, ni lisp en perl, ni java en perl. Perl est perl. S'il y a un problème qui devient plus important que perl idiomatique ne peut gérer et que vous commencez à avoir besoin de structures de classe plus complexes, écrivez-les. Connaître les modèles de conception pour pouvoir reconnaître "ce problème est devenu au point d'avoir besoin d'une usine abstraite" - mais ne commencez pas à essayer de créer une usine abstraite en perl si vous n'en avez pas besoin.

Certaines bibliothèques existent sous des formes OOP et plus traditionnelles. Voir Dois-je utiliser les interfaces CGI orientées fonction ou orientées objet? pour une vieille question SO où l'on demande de quelle manière utiliser la bibliothèque.

Communauté
la source
4
+ 1.Informations intéressantes. Compte tenu de tout cela, comment se fait-il qu'il existe de nombreux messages dans SO essayant de défendre / attaquer Perl comme une ancienne langue? Cela me semble puissant et utile.
user10326
2
Chacun a sa propre langue préférée. Beaucoup pensent qu'à moins qu'une langue soit capable de supporter New Thing This Week, la langue est ancienne et obsolète et tout devrait en être retiré. D'autres ont investi beaucoup de temps dans l'apprentissage d'une langue particulière et savent comment la faire fonctionner là où elle se trouve. Ceci est facilement changé en n'importe quelle langue qui ne bouge pas aussi vite que The Hot New Language. Perl souffre d'une privation de droits particulière lorsque le temps qu'il a fallu pour obtenir Perl 6 (n'importe quel jour .. euh .. année maintenant!). Cela ne devrait pas dissuader d'apprendre le perl - il est utilisé dans de nombreux endroits.
1
Vous constaterez probablement que perl est une lingua franca pour les scripts linux prenant une grande partie du rôle des scripts shell depuis les temps les plus anciens. Seuls les scripteurs shell les plus fidèles se plaindront si vous écrivez un script perl plutôt que bash lors de l'écriture de scripts sur un système * nix. L'une des choses les plus importantes pour Perl est CPAN - si l'on est sur le point d'entreprendre l'écriture d'une bibliothèque de taille raisonnable, vérifiez simplement si quelqu'un d'autre l'a déjà écrite.
1
Tout ce qui était auparavant un script shell d'une certaine complexité ou plus est souvent un script perl maintenant. Perl fonctionne également souvent comme un ruban adhésif / conduit entre les systèmes ou les applications. Son traitement de chaîne l'a également fait à la maison dans plusieurs autres industries (en particulier la bioinformatique - il suffit de regarder combien de questions basées sur l'ADN existent dans la balise perl sur SO).
4
Perl est un langage de programmation robuste et complet. Il peut être utilisé pour l'écriture de scripts (automatisation de l'interaction avec d'autres applications, y compris le shell), ou pour la construction d'utilitaires, ou même pour des applications à plus grande échelle. La haine de Perl a tendance à se concentrer sur des choses comme sa syntaxe dense et, dans une certaine mesure, sur une mauvaise compréhension du fait que Perl ne tente pas d'imposer des modèles de conception spécifiques à ses utilisateurs. J'utilise Perl tous les jours. J'utilise aussi fréquemment d'autres langues. J'apprécie l'expressivité et la puissance de Perl. Dépassez l'étape d'apprentissage difficile et vous l'aimerez probablement aussi.
DavidO
7

La position de Perl sur les paradigmes est TMTOWTDI (il y a plus d'une façon de le faire). C'est l'une des raisons pour lesquelles beaucoup de gens appellent en plaisantant Perl un langage en écriture seule . Il peut être beaucoup plus facile de l'écrire que de le lire, car le style d'une autre personne peut être complètement différent du vôtre.

Cela étant dit, OOP est certainement pris en charge en Perl. Si vous utilisez beaucoup de code tiers, il peut ou non s'agir de POO, mais pour votre propre code, vous pouvez faire de la POO à votre guise. En fait, j'ai d'abord appris la POO en Perl. J'ai d'abord essayé C ++ et il n'a pas "cliqué" pour une raison quelconque.

Karl Bielefeldt
la source
1
Pourquoi beaucoup de gens le considèrent comme une mauvaise option de carrière? Il semble qu'il soit puissant et puisse compléter d'autres langues dans le cadre de la panoplie d'outils.
user10326
3
Disons simplement que d'autres langues sont presque aussi puissantes et ont une structure beaucoup plus inhérente. Les entreprises aiment la structure.
Karl Bielefeldt
Pour un bon Perl POO tutoriel vérifier codeproject.com/Articles/3152/Perl-Object-Oriented-Programming
Pmarcoen
1
C'est un bon tutoriel OOP, expliquant le style OO intégré de Perl. Si vous trouvez ce code un peu bavard, vous pourriez être intéressé par la bibliothèque Perl Moose, qui automatise une grande partie du codage répétitif dans l'OO intégré. Mais il est préférable de commencer (IMH0) avec le style intégré.
matt freake
1
Je n'ai jamais trouvé Perl comme une mauvaise option de carrière. Trouvez un groupe Perl Mongers local et il y a de fortes chances qu'à presque chaque réunion, quelqu'un mentionne les offres d'emploi Perl.
DavidO
3

Je suis dans la même situation, j'utilise Java depuis très longtemps,

Avoir déménagé à Perl a été un choc et un soulagement, mais j'ai utilisé un livre intitulé `` Perl Best Practices ''. Cela aide beaucoup et si vous comprenez les concepts de base des langages de programmation, tout est facile à suivre.

N'oubliez pas qu'avec Perl, il y a plus d'une façon de le faire, j'ai passé d'innombrables heures à regarder certains codes et à les modifier, mais au final, cela se fait avec une simple erreur de syntaxe.

Sunny Patel
la source
0

Il existe plusieurs façons de gérer la réutilisation du code en Perl. De nombreux exemples ne font pas clairement la distinction entre les approches et de nombreuses classes en utilisent au moins deux.

Je conseille d'utiliser autant que possible le style OO et de n'utiliser l'EXPORTATEUR que si vous avez au moins trois classes ou plus qui ont besoin d'un cluster relativement petit de fonctions utilitaires.

Donc:

package Foo; 
use Foo::Util qw(util) ;
use strict ; 

sub foo {
}

sub bar {
}

1; 

package Foo::Bar ;
use Foo ; 
use Foo::Util qw(util) ;
our @ISA = qw(Foo) ; 
use strict ; 

sub bar {
}

1; 

package Foo::Util ; 
use Exporter ; 
our @ISA = qw(Exporter) ; 
our @EXPORT = qw(util) ;
use strict ; 

sub util {
}

1;

Je préfère visualiser l'approche OO et l' EXPORTERapproche comme deux dimensions différentes de la disponibilité du code, comme si les fonctions venaient dans le package actuel à partir de l'axe x ou y.

Dans l'exemple ci-dessus:

Foo::Bardérive la méthode foo()de la classeFoo

Foo::Bardéfinit une bar()méthode pour que la méthode polymorphe bar()ne soit pas dérivée de la classeFoo

Les deux classes Fooet Foo::Barreçoivent la EXPORTEDfonction ( pas la méthode ) util()du package ( pas la classe )Foo::Util

Les deux systèmes semblent compliqués mais ont une utilité très pratique. Le suivi de l'héritage multiple peut devenir difficile et rapide. Donc, avoir la deuxième dimension de la disponibilité du code, vous permet de garder votre arbre d'héritage petit et gérable.

Généralement, si une fonction est monolithique et relativement stupide, utilisez EXPORTER, sinon utilisez l'héritage. Mais ne vous embêtez pas EXPORTERdu tout à moins que ce que vous allez faire soit susceptible d'impliquer plus de 3 ou 4 packages.

James Aanderson
la source