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

Humour Informatique Discussion :

Quelle est la règle de codage la plus étrange que vous avez été forcé de suivre ?

  1. #101
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Je me dis que vous aurez peut-être une solution pour un cas rencontré dans un stage où j'ai rien trouvé d'autre qu'un GOTO.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    While(un_test){
      //section a de code
      if(machin) GOTO label;
      //section b de code
    } end while
    //section c de code
    label :
    //section d de code
    Le if est au milieu du while, si vrai on part sur le code après le label.
    Si on sort du while normalement, on exécute la section c avant d'exécuter la section d.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  2. #102
    Membre chevronné Avatar de LooserBoy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 1 085
    Points : 1 976
    Points
    1 976
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    Je me dis que vous aurez peut-être une solution pour un cas rencontré dans un stage où j'ai rien trouvé d'autre qu'un GOTO.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    While(un_test){
      //section a de code
      if(machin) GOTO label;
      //section b de code
    } end while
    //section c de code
    label :
    //section d de code
    Comme ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    While(un_test){
      //section a de code
      if(machin)
      {
         //section d de code
      }
      //section b de code
    } end while
    //section c de code
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  3. #103
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Ouais .... un flag de plus dans le corps de méthode n'aurait pas changé la face du monde, je ne vois pas trop la nécessité du goto en l'espèce.
    (surtout avec un branchement depuis un point unique).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  4. #104
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par LooserBoy Voir le message
    Comme ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    While(un_test){
      //section a de code
      if(machin)
      {
         //section d de code
      }
      //section b de code
    } end while
    //section c de code
    Non ce n'est pas équivalent, car, avec cette version du code

    1) on ne sort pas de la boucle while au moment du if
    2) les sections b et c sont quand même exécutées au lieu d’être ignorées, "sautées"

    Je peux me tromper, mais si j'ai bien compris, je pense qu'il faudrait plutôt faire comme ça

    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
    While(un_test)
    {
      //section a de code
    
      if(machin)
      {
         //section d de code
      }
    
       else
       {
          //section b de code
       }
    } end while
    
    if not (machin)
    {
        //section c de code
        //section d de code
    }
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  5. #105
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Citation Envoyé par shadowmoon Voir le message
    1) on ne sort pas de la boucle while au moment du if
    2) les sections b et c sont quand même exécutées au lieu d’être ignorées, "sautées"
    Et la section d du code n'est pas exécutée après la section c si on sort du while normalement (sans passer par le GOTO).
    Il y avait des variables communes dans les 4 sections, donc impossible de changer l'ordre dans lequel elles sont exécutées.

    @shadowmoon : Oui, en rajoutant une section d du code après la section c dans le if(not machin)
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  6. #106
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    euh faut remplacer le goto par un break sinon vous n'aurez pas le même comportement non?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  7. #107
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool continuer = true;
    While(un_test && continuer){
      //section a de code
      if(machin) {
        continuer = false;
      } else {
         //section b de code
      }
    } end while
    if (continuer) {
      //section c de code
    }
    //section d de code
    Version avec le break :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    While(un_test){
      //section a de code
      if(machin)
        break;
      //section b de code
    } end while
    if (!un_test) {
      //section c de code
    }
    //section d de code
    (si la section a ne peut pas changer un_test)

  8. #108
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Citation Envoyé par shadowmoon Voir le message
    Je peux me tromper, mais si j'ai bien compris, je pense qu'il faudrait plutôt faire comme ça

    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
    While(un_test)
    {
      //section a de code
    
      if(machin)
      {
         //section d de code
      }
    
       else
       {
          //section b de code
       }
    } end while
    
    if not (machin)
    {
        //section c de code
        //section d de code
    }
    Il manque aussi le break, et le code "section d" est dupliqué, ce qui est aussi souvent considéré comme une très mauvaise pratique car ça gène le refactoring et la maintenance du code.

    Il faut qu'on retourne tous à l'école !

    Enième proposition :

    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
    execute_c = true;
    While(un_test){
      //section a de code
      if(machin)
      {
        execute_c = false;
        break;
      }
      //section b de code
    } end while
    if (execute_c)
    {
      //section c de code
    }
    
    //section d de code

  9. #109
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    La solution de Troudhyl me semble correct
    (j'avais la flamme d'écrire le pseudo code )
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  10. #110
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 662
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 662
    Points : 6 943
    Points
    6 943
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    (j'avais la flamme d'écrire le pseudo code )
    Te brûle pas !

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (11.6 - 14.6)

  11. #111
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Citation Envoyé par Uther Voir le message
    Le problème des getter/setter n'a rien a voir avec l'introspection, ou la lisibilité, c'est même plutôt une plaie à ce niveau.

    Ils sont là car ils servent d'interface aux javabean. Un bean se doit d'offrir une encapsulation forte. Grâce au getter/setter les beans ont un contrôle complet sur leur propriétés qu'il peuvent restreindre (read/write only), vérifier, générer à la voler, ... etc
    Certes c'est lourd de faire un getter/setter quand on ne fait qu'une opération d'écriture/lecture de variable (Sun/Oracle devrait vraiment se pencher sur une syntaxe spéciale pour les propriétés). Mais ça permet de pouvoir faire évoluer l'opération dans le futur pour par exemple ajouter un contrôle sur un setter, ce qui n'est pas possible avec un accès direct à un champ.
    Je parle de DTO, pas de javabeans. De simples containers dont l'équivalent en C serait le struct. Je ne vois toujours pas le moindre petit début de pertinence à y mettre des accessors.
    cf Java Coding Conventions 10.1
    Glob
    What would you do if you were not afraid?

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  12. #112
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 549
    Points : 15 450
    Points
    15 450
    Par défaut
    Pour les DTO en effet ça ne sert à rien.

    C'est un exemple typique de bonne pratique dans un cas particulier (objet offrant une forte encapsulation) qui a été enseignée par certains comme un dogme absolu, généralement par fainéantise d'expliquer le pourquoi du comment.
    Du coup des gens veulent les étendre à des domaines ou elles sont contreproductives.

  13. #113
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par Glob Voir le message
    Je parle de DTO, pas de javabeans. De simples containers dont l'équivalent en C serait le struct. Je ne vois toujours pas le moindre petit début de pertinence à y mettre des accessors.
    cf Java Coding Conventions 10.1
    On peut imaginer une classe qui étend le DTO pour y ajouter une logique métier, tout en restant utilisable comme un DTO par la plupart des autres classes.
    Dans ce cas, si tu utilise directement les champs, tu peux zapper la logique métier. Pour moi, les getters/setters permettent de laisser ce genre de portes ouvertes, même si on en a pas besoin, a priori.

  14. #114
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Points : 396
    Points
    396
    Par défaut
    La pire règle de codage est encore de n'en imposer aucune.

    C'est ce qui m'arrive dans ma mission actuelle où, après avoir développé seul pendant quelques mois, un autre développeur se met au freestyle : différentes indentations par fichiers, différentes façons de présenter les {}, nommage complètement différent des méthodes / variables, etc.

    Et là, on se dit que dans les normes de codage ... il y a du bon !

  15. #115
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par bilbonec Voir le message
    La pire règle de codage est encore de n'en imposer aucune.

    C'est ce qui m'arrive dans ma mission actuelle où, après avoir développé seul pendant quelques mois, un autre développeur se met au freestyle : différentes indentations par fichiers, différentes façons de présenter les {}, nommage complètement différent des méthodes / variables, etc. !
    Dans la mesure où tu es là depuis quelques mois, ce n'est quand même pas difficile de lui imposer tes normes de codage. En bonne logique ta hiérarchie devrait te soutenir (sauf su tu n'insistes pas, bien sur).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  16. #116
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par bilbonec Voir le message
    Et là, on se dit que dans les normes de codage ... il y a du bon !
    Enfin bon, il y a des limites, dans la boite où je suis on a passé un fois 2 heures à discuter pour savoir où l'on met le begin dans un case (pour ma part j'étais plutôt en mode on s'en fou tant que ça reste lisible)

    et ça pinaillait entre

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Case XXX of
    1 : begin
      // cas 1
    end;
    2 : begin
      // cas 2
    end;

    et

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Case XXX of
    1 :
      begin
        // cas 1
      end;
    2 :
      begin
        // cas 2
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  17. #117
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 832
    Points : 2 625
    Points
    2 625
    Par défaut
    Citation Envoyé par rt15 Voir le message
    3 fois le même programme, qui copie le contenu d'un fichier vers un autre fichier :

    Sans goto, traitement normal en premier :
    Code C : 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
      char* lpBuffer;
      FILE* lpInputFile;
      FILE* lpOutputFile;
      int nSize;
      int nRes;
     
      nRes = 1;
     
      /* Open input file */
      lpInputFile = fopen("input.txt", "rb");
      if (lpInputFile)
      {
        /* Open output file */
        lpOutputFile = fopen("output.txt", "wb");
        if (lpOutputFile)
        {
          /* Retrieve size of the file */
          fseek(lpInputFile, 0, SEEK_END);
          nSize = ftell(lpInputFile);
          fseek(lpInputFile, 0, SEEK_SET);
     
          /* Allocate a buffer to store input file content */
          lpBuffer = (char*)malloc(nSize);
          if (lpBuffer)
          {
            /* Read from input file to buffer */
            if (fread(lpBuffer, 1, nSize, lpInputFile) == nSize)
            {
              /* Write from buffer to output file */
              if (fwrite(lpBuffer, 1, nSize, lpOutputFile) == nSize)
              {
                 nRes = 0;
              }
              else
              {
                perror("Failed to write to output file");
              }
            }
            else
            {
              perror("Failed to read input file");
            }
            free(lpBuffer);
          }
          else
          {
            perror("Failed to allocate buffer");
          }
          fclose(lpOutputFile);
        }
        else
        {
          perror("Failed to open output file");
        }
        fclose(lpInputFile);
      }
      else
      {
        perror("Failed to open input file");
      }
      return nRes;
    }

    Sans goto, traitement d'erreur en premier :
    Code C : 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
      char* lpBuffer;
      FILE* lpInputFile;
      FILE* lpOutputFile;
      int nSize;
      int nRes;
     
      nRes = 1;
     
      /* Open input file */
      lpInputFile = fopen("input.txt", "rb");
      if (!lpInputFile)
      {
        perror("Failed to open input file");
      }
      else
      {
        /* Open output file */
        lpOutputFile = fopen("output.txt", "wb");
        if (!lpOutputFile)
        {
          perror("Failed to open output file");
        }
        else
        {
          /* Retrieve size of the file */
          fseek(lpInputFile, 0, SEEK_END);
          nSize = ftell(lpInputFile);
          fseek(lpInputFile, 0, SEEK_SET);
     
          /* Allocate a buffer to store input file content */
          lpBuffer = (char*)malloc(nSize);
          if (!lpBuffer)
          {
            perror("Failed to allocate buffer");
          }
          else
          {
            /* Read from input file to buffer */
            if (fread(lpBuffer, 1, nSize, lpInputFile) != nSize)
            {
              perror("Failed to read input file");
            }
            else
            {
              /* Write from buffer to output file */
              if (fwrite(lpBuffer, 1, nSize, lpOutputFile) != nSize)
              {
                perror("Failed to write to output file");
              }
              else
              {
                nRes = 0;
              }
            }
            free(lpBuffer);
          }
          fclose(lpOutputFile);
        }
        fclose(lpInputFile);
      }
     
      return nRes;
    }


    Avec goto :
    Code C : 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
      char* lpBuffer;
      FILE* lpInputFile;
      FILE* lpOutputFile;
      int nSize;
      int nRes;
     
      nRes = 1;
     
      /* Open input file */
      lpInputFile = fopen("input.txt", "rb");
      if (!lpInputFile)
      {
        perror("Failed to open input file");
        goto the_end;
      }
     
      /* Open output file */
      lpOutputFile = fopen("output.txt", "wb");
      if (!lpOutputFile)
      {
        perror("Failed to open output file");
        goto close_input_file;
      }
     
      /* Retrieve size of the file */
      fseek(lpInputFile, 0, SEEK_END);
      nSize = ftell(lpInputFile);
      fseek(lpInputFile, 0, SEEK_SET);
     
      /* Allocate a buffer to store input file content */
      lpBuffer = (char*)malloc(nSize);
      if (!lpBuffer)
      {
        perror("Failed to allocate buffer");
        goto close_output_file;
      }
     
      /* Read from input file to buffer */
      if (fread(lpBuffer, 1, nSize, lpInputFile) != nSize)
      {
        perror("Failed to read input file");
        goto free_buffer;
      }
     
      /* Write from buffer to output file */
      if (fwrite(lpBuffer, 1, nSize, lpOutputFile) != nSize)
      {
        perror("Failed to write to output file");
        goto free_buffer;
      }
     
      nRes = 0;
     
    free_buffer:
      free(lpBuffer);
    close_output_file:
      fclose(lpOutputFile);
    close_input_file:
      fclose(lpInputFile);
    the_end:
      return nRes;
    }

    Franchement, avec la première solution, il est très difficile de vérifier que les ressources sont fermées correctement. Et la deuxième me semble moins lisible que la troisième, mais c'est un peu subjectif peut être.

    Et pour rappel, Linux est bourré de goto...

    Refaisons les mêmes codes proprement:

    Sans goto, traitement normal en premier :
    Code C : 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include <stdlib.h>
    #include <stdio.h>
     
    BOOLEAN printError(BOOLEAN condition, char *errorText)
    {
    	if(FALSE==condition)
    		perror(errorText);
    	return condition;
    }
     
    int main()
    {
      char* lpBuffer;
      FILE* lpInputFile;
      FILE* lpOutputFile;
      int nSize;
      int nRes;
     
      nRes = 1;
     
      /* Open input file */
      lpInputFile = fopen("input.txt", "rb");
      if (printError(lpInputFile,"Failed to open input file"))
      {
        /* Open output file */
        lpOutputFile = fopen("output.txt", "wb");
        if (printError(lpOutputFile,"Failed to open output file"))
        {
          /* Retrieve size of the file*/
    	  fseek(lpInputFile, 0, SEEK_END);
    	  nSize = ftell(lpInputFile);
    	  fseek(lpInputFile, 0, SEEK_SET);
     
          /* Allocate a buffer to store input file content */
          lpBuffer = (char*)malloc(nSize);
          if (printError(lpBuffer,"Failed to allocate buffer"))
            /* Read from input file to buffer */
            if (printError(fread(lpBuffer, 1, nSize, lpInputFile) == nSize,"Failed to read input file"))
              /* Write from buffer to output file */
              nRes= printError(fwrite(lpBuffer, 1, nSize, lpOutputFile) == nSize,"Failed to write to output file");
            free(lpBuffer);
          fclose(lpOutputFile);
        }
        fclose(lpInputFile);
      }
      return nRes;
    }

    A noter qu'en fait, on peut améliorer le truc encore...
    Par exemple, enlever des if:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          /* Allocate a buffer to store input file content */
          lpBuffer = (char*)malloc(nSize);
          nRes=
    		printError(lpBuffer,"Failed to allocate buffer") &&
            /* Read from input file to buffer */
    		printError(fread(lpBuffer, 1, nSize, lpInputFile) == nSize,"Failed to read input file") &&
            /* Write from buffer to output file */
            printError(fwrite(lpBuffer, 1, nSize, lpOutputFile) == nSize,"Failed to write to output file");
          free(lpBuffer); /* no use to check: no problem if free is null */
          fclose(lpOutputFile);
    L'astuce: les && permettent d'agir comme un if en fait. Astuce apprise grâce au shell: si la première condition est fausse, alors l'ensemble de la condition sera fausse, donc le compilateur intelligent ne prendra pas la peine de vérifier les autres conditions

    Sans goto, traitement d'erreur en premier :
    Ouai mais en fait, flemme de refaire la même astuce que précédemment.

    Résultat final: 19 lignes de gagnées (28.4% de taille de code en moins tout de même, presque 1/3!), moins d'indentations, pas de goto et un code globalement plus clair.
    Problème: coût d'appel à la fonction printError(int, char*) à chaque fois, qui peut être résolu via des macros, d'ailleurs. Ou le mot-clé inline en C++, mais j'ai tenu à respecter le langage C au maximum de mes souvenirs.

    On peut améliorer encore plus le truc, en utilisant:
    _ des constantes pour les messages d'erreur
    _ une macro pour remplacer le if, qui prenne en paramètre le message d'erreur.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    While(un_test){
      //section a de code
      if(machin) GOTO label;
      //section b de code
    } end while
    //section c de code
    label :
    //section d de
    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
    void monBloc(void)
    {
      static int flag=0;
      if(0 == flag)
      {
        ;//section d de code
        flag=1;
      }
    }
    
    While(un_test)
    {
      //section a de code
      if(machin)
      {
        monBloc();
        break;
      }
      //section b de code
    } end while
    //section c de code
    
    monBloc();
    Sinon:
    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
    void machin(bool condition)
    {
      //section d
    }
    
    bool boucle()
    {
      While(un_test){
        //section a de code
        if(machin) return;
        //section b de code
      } 
      //section c de code
    }
    
    main()
    {
      boucle();
      machin();
    }
    Les solutions, s'pas ce qui manque.

    Ah oui, je viens de me rappeler une horreur, vue par un prof:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fonction()
    {// debut fonction
      if()
      { // début if
        for(;;) 
        { //debut for
        } // fin for
      } // fin if
    }// fin fonction
    Arrgg!g!!!

  18. #118
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par Freem Voir le message
    L'astuce: les && permettent d'agir comme un if en fait. Astuce apprise grâce au shell: si la première condition est fausse, alors l'ensemble de la condition sera fausse, donc le compilateur intelligent ne prendra pas la peine de vérifier les autres conditions
    C'est effectivement le principe de l'évaluation paresseuse. Par contre, étant donné que c'est une optimisation du langage, tous les langages ne la pratiquent pas.

    Par exemple en shell (/bin/sh), il me semble bien que la commande test (ou son équivalent [ ... ]) ne pratique pas l'évaluation paresseuse (c'est d'ailleurs ce que confirme ce site).

  19. #119
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 146
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Ne pas avoir le droit de créer de nouvelle base de donnée pour des activités différentes !

    Imaginons par exemple que nous ayons créé une base correspondant à des recettes de cuisine, avec les champs "ingrédients", "durée" et "opérations".
    On décide ensuite de créer un planning d'entrainement sportif, du coup, dans ce cas, "ingrédients" correspond à "type d'exercice", "durée" à "lieu" et "opérations" à "équipement". Seulement, comme il manque un champ pour "durée de l'exercice", alors on va utiliser le champ "ingrédients" en séparant la valeur "type d'exercice" et "durée de l'exercice" par un délimiteur arbitraire...

    Tout cela est parfaitement résumé dans cet article...

    tu travaillais chez doctissimo ? :p

  20. #120
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 146
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par Uther Voir le message
    Non seulement :
    - le code que tu accuses d'être faux est tout à fait correct : fopen ne retourne NULL(soit 0) qu'en cas d'erreur. Si tu ne me crois pas, il suffit de consulter le man
    - la solution que tu proposes est incorrecte. Ton code ne gèrera pas les erreurs.

    Tout a fait d'accords que ce soit en C ou en PHP

Discussions similaires

  1. Réponses: 48
    Dernier message: 07/12/2010, 17h44
  2. Réponses: 48
    Dernier message: 07/12/2010, 17h44
  3. Réponses: 14
    Dernier message: 13/08/2010, 11h14
  4. [VBA-E]DatePart ? Quelle est la règle ?
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/05/2010, 13h17

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