|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Version courte :
Bien sûr les conseils habituels à la programmation en n'importe quel langage s'appliquent :
Version longue (aka "Les explications") : La devise de Perl est TIMTOWDI, c'est-à-dire "There Is More Than One Way To Do It", en français : "Il y a plus d'une façon de le faire !". Et effectivement Perl est un langage très flexible et puissant dans lequel vous pouvez adopter une multitude de méthodes différentes pour parvenir au même résultat. Malheureusement, cela ne signifie pas que toutes les méthodes sont également viables, également efficaces, ou également faciles à entretenir ou lisibles... Dans ce topic, je vais donc indiquer quelques points qui me semblent importants pour obtenir un résultat potable. Ce sujet est destiné aussi bien aux novices qu'aux expérimentés (je ne dirais pas aux experts, il n'y a pas beaucoup d'"experts" en Perl, et à mon avis ceux qui le sont doivent déjà savoir tout ce que je vais dire). Le pragma "strict" Qu'est-ce qu'un pragma ? C'est une instruction au compilateur/interpréteur qui modifie le comportement du langage sur une portée limitée. En Perl les pragmas sont chargés avec "use" ou déchargés avec "no", leur nom est tout en minuscule, contrairement aux noms de modules qui par convention doivent commencer par une majuscule. Le pragma "strict" interdit l'usage d'un certains nombre de constructions normalement valables en Perl mais qui sont responsables de la plupart des erreurs basiques que peuvent rencontrer un novice, voire parfois un expert. Pourquoi ces constructions ne sont-elles pas simplement supprimés du langage si elles sont si dangereuse me demanderez vous. Pour trois raisons :
Mais quels sont donc les effets concrets de strict ? Sans rentrer dans le détail, les principaux effets sont l'obligation de déclarer toutes ses nouvelles variables (avec my() pour les variables lexicales, our() pour les variables globales de paquetage), l'interdiction des mots "nus" (barewords, autrement dit, sans 'strict' Perl interprète tout mot isolé qu'il ne reconnait pas (pas un nom de fonction ou de HANDLE de fichier) comme une chaîne de caractères), et l'interdiction des références symboliques (l'utilisation d'une chaîne de caractère variable comme nom de variable). Le pragma "warnings" A partir de Perl 5.6 vous pouvez utiliser ce pragma en remplacement de l'option en ligne de commande -w (qu'on pouvait également indiquer sur la ligne de shebang d'un script). Il active les avertissements de Perl, qui vous indiquent les constructions douteuses ou ressemblant à des erreurs classiques dans votre code, à l'exécution comme à la compilation. Il ne s'agira pas toujours d'erreurs réelles, mais souvent un meilleur style de programmation peut faire disparaître ces avertissements, et dans les rares cas ou vous vous estimez justifié dans votre utilisation, un autre avantage du pragma warnings apparaîtra : vous pouvez le désactivez sélectivement sur une portion de code donnée et pour certains types d'avertissements précisément, lisez "perldoc perllexwarn" pour une explication en profondeur des avantages du pragma sur l'option -w. Perl::Tidy Le module Perl::Tidy et l'utilitaire perltidy qui vient avec ce module permettent de reformater aisément son code Perl, par exemple pour le mettre en conformité avec une norme d'entreprise ou un format que vous préférez à celui employé dans le code d'origine. Le formatage est complètement configurable et vous pouvez ainsi façonner le résultat exactement à votre goût. Indispensable !! Perl::Critic Perl::Critic et l'utilitaire perlcritic associé critique votre code selon un certain nombre de règles de bonne pratique décrites sous forme de module, dont beaucoup sont distribuées avec Perl::Critic (mais pas toutes), vous pouvez configurer exactement lesquelles prendre en compte (en plus du système de "niveau de sévérité" intégré à Perl::Critic) ou même en écrire de nouvelle. En complément de cela si vous avez le temps (ou les sous), lisez "Perl Best Practices" ou sa traduction française "De l'art de programmer en Perl", excellent bouquin, qui se lit facilement, ( mais un peu cher ) et qui a servi de base à perlcritic.Les modules et le CPAN Ne réinventez pas la roue : surtout si vous êtes débutant (et que vous n'êtes pas en train de coder dans un but pédagogique), le code que vous produirez sera sans doute moins bon, moins robuste, moins efficace que le module du CPAN correspondant, et en plus il sera plus long à réécrire. Pensez toujours au CPAN, faites vos recherches dessus avec le site officiel ou le CPAN pour Win32 (qui vous indiquera où trouver vos paquetages ppm). Ce qui ne veut pas dire que votre programme doit ressembler à une collection de modules du CPAN ! N'utilisez pas un module pour une seule fonction facilement refaites en quelques lignes par vous même (n'oubliez pas néanmoins que parfois la fonction du module a été écrite pour effectuer cette tâche bien plus rapidement et de façon bien plus robuste que votre pauvre petit remplacement). Ceci ne vaut pas pour les modules du CORE, ils sont disponibles partout (ou presque, utilisez Module::CoreList pour en avoir le coeur net) et sont la plupart du temps très bien codés donc n'hésitez surtout pas à les utiliser (sauf Switch, oubliez cette abomination !! Si vous voulez un switch..case en Perl, utilisez Perl5.10 qui devrait sortir cette année (2007) et offrir un très bon switch intégré. Les hashs sont souvent également une excellente alternative à la plupart des usages de switch..case). Il y a également le cas où vous n'êtes pas tout à fait satisfait des modules disponibles sur le CPAN, n'hésitez pas alors à vous lancer dans la création d'un nouveau module (si vous êtes un programmeur suffisamment expérimenté), c'est ainsi qu'on fait progresser les choses ! Vous pouvez également proposer un patch à l'auteur d'un des modules du CPAN : s'il améliore les choses, ne brise pas la compatibilité arrière et relève vraiment du module, il sera très certainement accepté. -- Jedaï |
||
|
|
10
|
|
|
#2 |
|
Invité régulier
![]() Inscription : mars 2008 Messages : 16 ![]() |
Bonjour,
En lisant votre article, il me vient une foule de questions que je résumerais en une grande question "bateau"... Qu'en est-il du temps d'exécution? Oui, il faut découper son script en sous-programmes, en modules, etc. Mais jusqu'à quel point? Je me souviens d'un script php que j'avais encodé comme un cochon, répetant les mêmes lignes de codes des dizaines et dizaines de fois . Lorsque j'ai entrepris de nettoyer ce script, certes j'ai réduis mon code de plus de 800 lignes en moins de 120 mais le temps d'exécution avait plus que doublé. Qu'en est-il avec Perl? |
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() |
Le degré exact d'abstraction que vous voulez atteindre est à déterminer par vous même. Néanmoins les avantages du découpage en fonctions sont énormes : maintenabilité énormément améliorée (lisibilité plus grande + mise à jour en un seul point plutôt qu'éparpillée dans les fichiers), risque de bugs décru, extension facile...
Un code de 800 lignes n'est pas grand chose encore, mais vous l'avez réduit d'un facteur 7 à peu près, et le facteur de réduction a tendance à augmenter plutôt que diminuer avec la taille du programme. A grande échelle, le découpage en fonction fait la différence entre un bourbier inutilisable et un programme vivant et évolutif. Le doublement du temps d'exécution me semble un peu excessif, il est possible que votre design n'ait pas été trop bien pensé (si vous vous êtes contenté de regrouper les morceaux de code similaires). Mais même ainsi, il me semble acceptable, vu que de toute façon, en Perl comme en PHP, la performance n'est pas notre but premier (sinon autant coder en Assembleur Je rappelle également que le découpage peut faciliter l'amélioration des performances par la suite : le profiling est plus facile, la réduction des goulets d'étranglement plus ciblée. -- Jedaï |
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Inscription : avril 2004 Messages : 13 535 ![]() |
La question Débutants ou expérimentés : Comment écrire du bon code en Perl à été rajoutés dans la FAQ dans la section divers.
__________________
|
|
|
00
|
|
|
#5 | |||
|
Futur Membre du Club
![]() Inscription : juin 2009 Messages : 25 ![]() |
Citation:
Après avoir croisé et employé un certain nombre de langages et de paradigmes différents, je me suis dernièrement retrouvé face à Perl et la nécessité (pour diverses raisons) de devoir m'en servir et l'apprendre. Ce langage m'a l'air, somme toute, intéressant et, sur certains aspects, élégant. Par contre un point me taraude : On me conseil partout d'employer des %Hash au lieux des @Arrays ... Il semble (et c'est ce qui ressort souvent) que les %Hash en perl permettraient des insertions/suppressions/lecture en O(1). Seulement voila, dans ma pauvre petite tête j'avais tendance à penser qu'on aurait plutôt un O(Log(n)) ... Les %Hash sont ils en perl (je le crains) des sortes de tables creuses sur un modèle de ce genre : Code :
Ou est-ce une autre méthode encore plus astucieuse (car moins consomatrice en espace) |
|||
|
|
00
|
|
|
#6 |
|
Membre confirmé
![]() ![]() Dimitry Ernot Consultant télécommunications & réseaux intelligents Inscription : janvier 2011 Messages : 184 ![]() |
Je ne sais pas comment fonctionnent en interne les tables de hachages de Perl.
Mais je peux t'en donner le fonctionnement général : Une table de hachage est une structure de données complexe (souvent un arbre, un tableau de listes chaînées...). Elle a la particularité d'accéder aux données au travers d'une fonction de hachage (un peu comme MD5) qui dépend fortement du type de structure servant de clé. Cette fonction calcule un indice ( souvent numérique) plus ou moins unique (on ne peut que rarement garantir l'absence de collisions). De cet indice, tu peux retrouver la donnée voulue ou insérer une nouvelle entrée. Donc ce n'est pas la clé en elle-même qui te permet de retrouver la données mais son hachage. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com