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

C Discussion :

Que pensez vous du goto [Débat]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Par défaut
    Selon Peter Aitken et Bradley Jones:
    Quand un programme exécute un branchement après une instruction goto, il ne garde aucune trace de l'emplacemet d'où il vient et l'ordre d'exécution va vite se compliquer. C'est ce que l'on appelle du code spaghetti.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    eh bien moi j'utilisais comme un forcené les GOTO en FORTRAN, car c'était la norme des programmes scientifiques, au début des années 80.

    Les gros codes FORTRAN existants encore (librairie maths du CERN, modèles numériques) resteront tel quels, car personne ne les ré-écrira (de 20 à 30 ans de test opérationnel et +20 millions de lignes de code, ça se refait pas..).

    Par contre, depuis 17 ans que je fait du C, et sur de très gros projets complexes (> 1 million de lignes de code) (au total plus de 2 millions de ligne de code), je n'ai JAMAIS utilisé un seul GOTO..

    Effectivement le point central est la maintenance : il est extrémement difficile et long de relire et "formaliser" un code avec des sauts. Déjà c'est diffcile en Fortran avec les formats numérotés. Mais en plus avec les goto...

    De plus, certaines normes pour certains types de projets (les projets de la NASA par exemple), en interdisent formellement l'usage.

    Mais c'est principalement que c'est une autre manière de penser. Et bien sûr que l'assembleur fait des JMP. Mais ce pourquoi on a inventé des langages de programmation c'est justement pour pas être au niveau de la machine, mais au niveau conceptuel.....

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par amaury pouly
    Là c'est vraiment particulier mais dans certaines circonstances mieux vaut ne pas faire autrement à mon avis
    Dans cet exemple particulier, l'interet du goto est, si j'ai bien compris, d'executer dans le if() le meme code que dans un des case. Personellement, j'aurais plutot ecrit une fonction effectuant ce traitement et appele la fonction dans le if et dans le case.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vic
    J'apporte mon grain de sel, y'a pas de raison

    A mon avis le principal reproche qu'on peut faire au goto (et à raison), c'est de casser l'aspect structuré du code, et surtout permettre des sauts en arrière, ce qui crée un flux programmatique qui se croise, le fameux "spaghetti code". Mais alors que dire des break, des continue, des return lorsqu'ils ne sont pas en fin de fonction ? Que dire même des switch ?
    La portée des break et des continue est définie (bloc de structure de code). Avec un goto, c'est plus flou et on peut sortir brutalement d'une structure de code. Quand aux return multiples, je les combat aussi ardemment que les goto sauvages.
    L'usage du goto se justifie dans deux cas bien précis :

    Permier cas, traitement d'erreur. Exemple :
    Ok.
    Deuxième cas, pouvoir sortir rapidement d'une construction très complexe et remonter une erreur.
    Eventuellement, mais une variable 'err' bien gérée (0 = OK, non 0 = ERR) est très simple à intégrer dans les conditions des structures de code.

    Je pense que tout le monde est d'accord pour dire 'le goto injustifié c'est mal tant qu'il existe une alternative simple et viable'. Ce discours s'adresse surtout aux débutants, afin de les inciter à utiliser les structures de codes qui couvrent 100% des cas. Ensuite, si on veut simplifier certains traitement 'exceptionnels', peut être. Mais il est certain que l'on peut toujours s'en passer.

  5. #5
    Membre éprouvé Avatar de amaury pouly
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 157
    Par défaut
    Dans cet exemple particulier, l'interet du goto est, si j'ai bien compris, d'executer dans le if() le meme code que dans un des case. Personellement, j'aurais plutot ecrit une fonction effectuant ce traitement et appele la fonction dans le if et dans le case.
    Je ne l'ai pas fait car cette fonction est appelée trop souvent et puis que le traitement n'est pas très long(3-4 lignes) . Certes on aurait pû inliner mais pour moi çà n'en valait pas la peine .
    D'ailleurs dans cette structure il y avait d'autres cas qui rammenaient au cas.
    Néanmoins c'est exceptionnel comme utilisation .

  6. #6
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut pas de goto dans le C
    les gotos permettent de casser la structure logicielle. Typiquement, on peut faire des trucs comme ceci

    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
    int Fct1(int Param)
    {
       int ReturnValue;
       if (Param)
       {
          goto Toto;
          ReturnValue=1;
       }
       else
       {
          ReturnValue=2;
       }
     
    Toto:
      return (ReturnValue);
    }
    Ici c'est facile, on a généré au beau bug facilement visible, mais parfois l'algorithme est plus complexe, et on ne voit pas ce type d'erreur.

    Structurer correctement son logiciel permet de le rendre plus robuste, et plus facile à maintenir.
    Si des normes d'écritures en langage C on dit qu'il ne fallait surtout pas l'utiliser, ce n'est pas pour rien.

    A+
    Page sur Developpez : http://pbriand.developpez.com

  7. #7
    Membre Expert
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Par défaut
    Personnelement je n'ia utilisé les goto que dans un domaine :
    La programmation noyau Linux. Au début j'étais réticent à utiliser le Goto, mais au final, s'il est correctement utiliser il peut aider à la lisibilité du code.
    J'utilisais donc le goto toujours en descendant pour la gestion des erreurs
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    res0=...;
    if(!res1)
       goto err1;
    <...>
    if(!res2)
       goto err2;
    <...>
    err1:
       free(res0);
    err2:
       free(res1);
    <...>
       return;
    il est clair qu'il est toujours possible de faire sans, mais si on cadre bien son emploi, on peut alleger le code sans perdre en lisibilité et même en gagner un peu avec justement l'allegement du code.

  8. #8
    Invité de passage
    Inscrit en
    Janvier 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1
    Par défaut
    Je cite "Méthodologie de la programmation en C" de Jean Pierre Braquelaire , une référence dans le domaine de la prog !!! Mon mentor !! Un ancien prof de la fac il y a longtemps...

    "

    Le branchement est à utiliser avec la plus grande prudence. Cependant, il est parfois utile pour simuler des échappements non implémentés en C (essentiellement la sortie de plusieurs boucles imbriquées).

    On ne doit l'utiliser seulement si les intrusctions break et continue sont insuffisantes. Par exemple, on ne peut, avec l'instruction break, sortir d'une boucle qui se trouve dans un aiguillage imbriqué dans la boucle. Dans ce cas, Break permet seulement de sortir de l'aiguillage.

    La sortie de plusieurs boucles imbriquées est également un cas que l'on ne peut gérer avec un échappement. C'est le cas de l'exemple suivant, présentant le parcours d'une liste de listes avec arrêt sur le premier élément vérifiant une condition donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                     for (jour = 0; jour < 7; jour++)
                            for (heure = 1; heure < 24; heure++)
                                 if (semaine[jour][heure]<semaine[jour][heure-1])
                                 goto baisse;
                    baisse:
    On peut éviter ici l'utilisation du branchement en plaçant l'instruction dans
    une fonction, dont on sort au moyen d'un return :

    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
     
    void recherche(int *j, int *h)
    {
        int jour, heure;
        for (jour = 0; jour < 7; jour++)
              for (heure = 1; heure < 24; heure++)
                   if (semaine [jour] [heure] <Semaine [jour] [heure-1])
                      {
                        *j = jour;
                        *h = heure;
                        return;
                       }     
        *j = jour;
        *h = heure;
    }
    Cependant, la gestion des paramètres par référence alourdit l'écriture et entraîne une duplication de code. Il est plus préférable d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void recherche(int *j, int *h)
    {
        int jour, heure;
        for (jour = 0; jour < 7; jour++)
              for (heure = 1; heure < 24; heure++)
                   if (semaine[jour][heure]<semaine[jour][heure-1])
                   goto fin_de_boucle;
     
        fin_de_boucle:
        *j = jour; 
        *h = jour;
    }
    Une autre utilisation classique du saut est la gestion d'erreurs, avec interruption du traitement (goto erreur) ou reprise (goto début). Tous ces
    exemples d'utilisation du branchement sont construits sur le même modèle: la sortie de plusieurs blocs imbriqués. Il est par contre préférable d'éviter d'utiliser un goto pour se déplacer dans un bloc ou pour rentrer dans un bloc de profondeur inférieure.

    cela devrait clore un éternel débat qui n'a plus lieu d'être !!!

  9. #9
    Membre confirmé
    Profil pro
    responsable de développement
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : responsable de développement

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Par défaut
    Salut,

    Moi non plus j'aime pas les goto... il fut un temps où je les virais... Pourtant y'a pas que lui qui n'est pas structuré :
    Mais dans un switch() case: break...
    le break est un goto comme le continue dans un while() ou for(;

    Souvent en virant un goto (mis par qq d'autre ), j'ai rendu le code moins joli (question de goût) mais je préfère...

    v'la question de goût et d'expérience...

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Moi non plus j'aime pas les goto... il fut un temps où je les virais... Pourtant y'a pas que lui qui n'est pas structuré :
    Mais dans un switch() case: break...
    Je trouve tout de même une instruction switch beaucoup plus structurée qu'un goto. Contrairement au goto, je ne trouve pas qu'elle nuit à la lisibilité du code. Perso, je n'ai jamais utilisé la possibilité offerte par goto.

    Meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par mujigka
    Moi non plus j'aime pas les goto... il fut un temps où je les virais... Pourtant y'a pas que lui qui n'est pas structuré :
    Mais dans un switch() case: break...
    Je trouve tout de même une instruction switch beaucoup plus structurée qu'un goto. Contrairement au goto, je ne trouve pas qu'elle nuit à la lisibilité du code. Perso, je n'ai jamais utilisé la possibilité offerte par goto.

    Meilleures salutations

    Thierry
    Idem, je n'ai plus utilise un seul goto depuis le temps ou je programmais en Basic sur ma calculatrice sur les bancs du lycee... (aaah les cours de physique).
    Et je m'en porte tres bien.

  12. #12
    Membre confirmé
    Profil pro
    responsable de développement
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : responsable de développement

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Par défaut
    OK pour le Goto, ce n’est pas beau…

    Mais quand on parle de structure (voir réponse de Vic sur les break, continue, return…) je suis entièrement d’accord… et donc ce n’est pas la seule réponse pour ne pas utiliser le Goto.

    Le seul langage qui respecte le flux de programmation… c’est le Lisp et ces dérivés… Pratiquez-le un peu (et même beaucoup) et vous connaîtrais les contraintes d’un respect des flux…

  13. #13
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Le seul langage qui respecte le flux de programmation… c’est le Lisp et ces dérivés… Pratiquez-le un peu (et même beaucoup) et vous connaîtrais les contraintes d’un respect des flux…
    Un code C bien structuré qui n'utilise pas de goto et qui n'abuse pas de la compilation conditionnelle respecte à mon sens relativement bien le flux de programmation. Qu'est-ce que Lisp a de plus à ce niveau? J'ai beaucoup de problème avec la synthaxe du LISP (et j'ai très peu d'expérience en programmation fonctionnelle), mais c'est vrai que je ne me suis pas acharné non plus. Je vais étudier cela de plus près.

    Meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  14. #14
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 335
    Par défaut
    Citation Envoyé par argoet
    La regle : Pas de goto dans un programme

    La valeur d'un programmeur est inversement proportionnel au nombre de goto que l'on trouve dans son code

    Pour clarifier ton programme Utilise les sous programmes avec les commentaire qui vont bien
    entierement d'accord avec cette regle goto est une aberation..

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Par défaut
    bon dsl j'ai pas tout lu donc ça a peut etre deja été dit, mais il y a toujours l'argument d'autorité :

    Dijkstra a dit que goto c'est mal :
    http://www.acm.org/classics/oct95/

    Et moi je lui fait confiance

  16. #16
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Dijkstra a dit que goto c'est mal :
    http://www.acm.org/classics/oct95/

    Et moi je lui fait confiance
    Ca c'est tout de même limité comme réflexion. Il faut se méfier des gourous et de leurs dogmes. En l'occurence, tu fais bien de lui faire confiance.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 154
    Par défaut
    hm c'est pas si limité que ça, Dijkstra est un chercheur connu, et je m'appuis sur ses résultats... c'est une démarche courante

  18. #18
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    C'était juste la façon dont tu l'a dit! Je ne met pas en doute ses dires, d'autant plus que je suis d'accord.

    Salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  19. #19
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut Re: Goto or not goto?
    Personellement j trouve que goto est indique pour resoudre uncertain nombre de problemes et notament ceux de saut d'instruction et j ne comprend pas non plus pourquoi elle sucite tant de crainte. une fois qu'on sait comment ca marche ce n'est plus du tou illisible je trouve.

  20. #20
    Membre éclairé

    Inscrit en
    Décembre 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 260
    Par défaut
    je pense su'on doit profiter des avantages de la programmation structuré et ne pas abusé des goto.Car sutout pr les gens qui ont deja programmer en assembleur on peut simuler des tests des boucles jsute avec les gotos et le code et ne pas du tout claire et s'est en plus en plus difficile pr le maintenir ou le corriger.

+ Répondre à la discussion
Cette discussion est résolue.
Page 7 sur 8 PremièrePremière ... 345678 DernièreDernière

Discussions similaires

  1. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 10h17
  2. Que pensez vous de filemaker
    Par thpopeye dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 14/06/2007, 15h20
  3. Que pensez vous du nouveau kernel 2.6 ?
    Par GLDavid dans le forum Administration système
    Réponses: 58
    Dernier message: 02/08/2004, 15h45
  4. [Débat] Que pensez-vous des langages à typage dynamique?
    Par Eusebius dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 16/06/2004, 12h12
  5. Que pensez vous du mariage ASP Flash?
    Par tyma dans le forum Flash
    Réponses: 4
    Dernier message: 09/07/2003, 15h00

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