IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

ecriture de code plus propre


Sujet :

Programmation et administration système Perl

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut ecriture de code plus propre
    Bonjour,

    Est ce que vous connaissez une façon d'écrire ce code plus propre :

    Autrement dit, je souhaiterai aligner ma variable $Dump_Base_SQL sur l'ensemble de mon script ou faire des appels via des fonctions. Comment puis je faire ?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
    my @TableauLigne;
    my $Finish_Task_Archiving = "XX=" ;
    open(FIC, "<${TempSql}/${FicSqlTmp}") || die "Ouverture impossible du fichier ${FicSqlTmp}: $!";	
     
    				while ($Ligne = <FIC> ) 
       				{  		
    					if (grep(/$Finish_Task_Archiving/, $Ligne)) 
    					{
    						#Supprime les espaces et tabulations pour remplacer par ¤
    						$Ligne =~ s/[\t\s]//g;
    						@TableauLigne=split(/\XX=/,$Ligne);
    						my $UneBase=$TableauLigne[1];
    						print ">${UneBase}<\n";
     
     
    my $Dump_Base_SQL = <<"SQL1";
    use master;
    BACKUP DATABASE ${UneBase} TO  DISK = N'${TempSql}/${Instance}_${UneBase}.dmp' 
    WITH NOFORMAT, INIT,  NAME = N'dump-Complet ${UneBase}', 
    SKIP, NOREWIND, NOUNLOAD,  STATS = 10 ;
    SQL1
     
    						print "$Dump_Base_SQL\n";
    						my $CmdDump=system("$SqmCmd -S${Host}\\${Instance} -Q \"${Dump_Base_SQL}\" -o \"${TempSql}/${UneBase}_${FicSqlDump}\"") ;
    					}
    				}
    close (FIC);

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Tu pourrais rajouter, pour commencer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    Ta façon d'écrire $Dump_Base_SQL ressemble à du Bash. Pourquoi ne pas utiliser ce que permet Perl ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $insert_deb =    "use master;\n".
    "BACKUP DATABASE ${UneBase} TO  DISK = N'${TempSql}/${Instance}_${UneBase}.dmp'\n".
    "WITH NOFORMAT, INIT,  NAME = N'dump-Complet ${UneBase}',\n". 
    "SKIP, NOREWIND, NOUNLOAD,  STATS = 10 ;"
    Le . permet de concaténer. N'hésite pas à mettre tes appels de fonctions sur plusieurs lignes pour une meilleure lisibilité.
    Ton indentation n'est pas très cohérente.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    ++, commence par utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    et par déclarer toutes tes variables lexicalement (avec "my") dans le scope le plus étroit possible. Il ne semble, par exemple, pas nécessaire de déclarer @TableauLigne comme une variable globale au début du script, alors que cette variable n'est utilisée qu'à l'intérieur du bloc if lui même à l'intérieur du bloc while.

    J'essaierai de revenir quand je serai sur un vrai ordi pour te proposer une version plus conforme aux bonnes pratiques communément admises par le communauté Perl.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    voici une première proposition avec des commentaires dans le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    # je ne sais pas d'où viennent toutes les variables ci-dessous, non déclarées et non initialisées
    # j'ai ajouté leur déclaration pour tester la compilation mais ça ne fonctionnera pas pour
    # autant tant qu'elles ne sont pas initialisées
    my ($TempSql, $FicSqlTmp, $Instance, $SqmCmd, $Host, $FicSqlDump);
     
    my $Finish_Task_Archiving = "XX=" ;
    open my $FIC, "<", "$TempSql/$FicSqlTmp" or die "Ouverture impossible du fichier $FicSqlTmp: $!";
    # Note: j'ai modernisé la syntaxe d'ouverture du fichier et utilisé un FH lexical ($FIC)
     
     
    while (my $Ligne = <$FIC> ) 
    {  		
    	if (grep(/$Finish_Task_Archiving/, $Ligne)) 
    	{
    		$Ligne =~ s/\s//g; # \s est une classe de caractères qui reconnaît les espaces et les tabulations
    		my $UneBase = (split /\XX=/, $Ligne)[1];
    		print ">${UneBase}<\n";
     
    my $Dump_Base_SQL = <<"SQL1";
    use master;
    BACKUP DATABASE $UneBase TO  DISK = N'$TempSql/${Instance}_$UneBase.dmp' 
    WITH NOFORMAT, INIT,  NAME = N'dump-Complet $UneBase', 
    SKIP, NOREWIND, NOUNLOAD,  STATS = 10 ;
    SQL1
     
    # note: d'où viennent les variables $TempSql et ${Instance}
     
    		print "$Dump_Base_SQL\n";
    		my $CmdDump = system("$SqmCmd -S$Host\\$Instance -Q \"$Dump_Base_SQL\" -o \"$TempSql/${UneBase}_$FicSqlDump\"") ;
    	}
    }
    close ($FIC);
    J'ajoute que ton "heredoc" au milieu de la boucle while rend le formatage peu lisible. Perso, je déclarerais un modèle pour cette commande avec un emplacement pour la base au début puis ferais la substitution au moment où la base est connue. Dans la seconde proposition ci-dessous, j'ai aussi remplacé le bloc if par un next quand la condition n'est pas satisfaite, une imbrication de bloc en moins rend le code plus lisible à mes yeux (mais ce n'est que mon avis personnel). En définitive, quelque chose comme cela:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    # je ne sais pas d'où viennent toutes les variables ci-dessous, non déclarées et non initialisées
    # j'ai ajouté leur déclaration pour tester la compilation mais ça ne fonctionnera pas pour
    # autant tant qu'elles ne sont pas initialisées
    my ($TempSql, $FicSqlTmp, $Instance, $SqmCmd, $Host, $FicSqlDump);
     
    my $modele_SQL = <<"SQL1";
    use master;
    BACKUP DATABASE LABASE TO  DISK = N'$TempSql/${Instance}_LABASE.dmp' 
    WITH NOFORMAT, INIT,  NAME = N'dump-Complet LABASE', 
    SKIP, NOREWIND, NOUNLOAD,  STATS = 10 ;
    SQL1
     
    open my $FIC, "<", "$TempSql/$FicSqlTmp" or die "Ouverture impossible du fichier $FicSqlTmp: $!";
     
    while (my $Ligne = <$FIC> ) 
    {  		
    	next unless $Ligne =~ /XX=/; # une expression régulière aussi simple, autant la coder en dur, c'est plus clair et souvent plus rapide (elle n'est compilée qu'une fois)
    	$Ligne =~ s/\s//g; # \s est une classe de caractères qui reconnaît les espaces et les tabulations
    	my $UneBase = (split /\XX=/, $Ligne)[1];
    	print ">${UneBase}<\n";
    	my $Dump_Base_SQL = $modele_SQL;
    	$Dump_Base_SQL =~ s/LABASE/$UneBase/g;
    	print "$Dump_Base_SQL\n";
    	my $CmdDump = system("$SqmCmd -S$Host\\$Instance -Q \"$Dump_Base_SQL\" -o \"$TempSql/${UneBase}_$FicSqlDump\"") ;
    }
    close ($FIC);
    A mon avis, ça rend la logique du programme bien plus lisible. Et la boucle while est maintenant suffisamment courte pour qu'il ne paraisse pas utile de déplacer une partie du code dans une fonction.

    Dernier point: Perl n'est pas du shell, il n'est pas utile d'utiliser des accolades autour du nom des variables, sauf s'il y a un risque d'ambiguïté: $UneBase fonctionne bien, inutile d'utiliser ${UneBase}, cela nuit à la lisibilité. (Je sais que ce n'est pas toujours indispensable non plus en shell, mais on le fait très souvent en shell pour éviter des problèmes qui ne se posent généralement pas en Perl.)

Discussions similaires

  1. Comment rendre ce code plus propre ?
    Par n0-sheep dans le forum C++
    Réponses: 2
    Dernier message: 15/12/2013, 17h31
  2. petit code plus propre ?
    Par thibotus01 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 20/11/2013, 16h34
  3. Comment rendre plus propre ce code super simple svp ?
    Par frakosun dans le forum jQuery
    Réponses: 4
    Dernier message: 28/10/2009, 09h31
  4. Réponses: 1
    Dernier message: 04/08/2008, 22h42
  5. rendre mon code plus propre
    Par superspike23 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 26/01/2008, 10h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo