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 :

Algorithmie et BREAK, RETURN.


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Août 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 1
    Par défaut Algorithmie et BREAK, RETURN.
    Bonjour à tous,

    Je développe depuis quelques années maintenant mais je me posais une petite question.
    Depuis toujours mes professeurs me disent qu'un 'break' n'est pas algorithmiquement correct.

    En langage C, je m'efforce donc de faire:

    unsigned char b = 0;
    while(b==0 && ...)
    if(...)b=1;

    alors qu'il serait possible de faire:
    for(...)if(...)break;

    Pour l'ordinateur, la solution que j'utilise, c'est à l'évidence un test à faire en plus à chaque tour à l'inverse du break qui permettrait de sortir directement.

    Alors... faut-il bannir le break ? Est-ce impropre ?

    Merci beaucoup,
    devback

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Ma préférence va largement au break, et je pense que c'est le cas de beaucoup de monde.

    Ce que l'on reproche généralement au break, c'est un peu le même procès que l'on tient à goto, mais ce n'est pas valable car cela ne brise pas le concept de programmation structurée : on sait toujours où on va sortir même si la boucle évolue, et on sait toujours pourquoi.

    Ces récriminations peuvent être justifiées s'il y a des post-conditions à l'intérieur de la boucle qui imposent qu'un cycle se finisse proprement (comme par exemple l'ouverture et la re-fermeture d'un fichier) mais, dans ce cas, c'est au programmeur de faire le bon choix.

    Personnellement, je trouve que remplacer un break statique et connu à la compilation par un booléen en mémoire dont la valeur dépend du contexte à l'exécution, c'est un remède bien pire que le mal.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Ha !!! le débat théoriciens contre praticiens.

    Le débat sur le break (et aussi le continue qui doit être du même ordre d'idée) rejoint le débat du goto (à un moindre niveau tout de même).

    Je suis développeur et à ce titre, je suis amené à écrire du code mais surtout , à le relire.

    Ce qui m'importe le plus lors de cette relecture, c'est d'avoir une structure de code facile à lire et à comprendre.

    Les tests tels que tu les décrits "while(b==0 && ...)" sont parfois illisibles et il vaut mieux alors un "break" (ou "continue") bien placé qui améliore la compréhension et la relecture du code.

    Pour moi, lorsque j'écris, je ne m'interdit jamais un "break" ou un "continue" si cela doit simplifier le code au risque de choquer les théoriciens du langage. Il m'est même arrivé d'écrire des instructions "goto" (oui oui, j'assume) car dans certains cas (gestion des erreurs principalement), cela simplifiait vraiment beaucoup la structure de code.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    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
    Citation Envoyé par ram-0000 Voir le message
    Il m'est même arrivé d'écrire des instructions "goto" (oui oui, j'assume) car dans certains cas (gestion des erreurs principalement), cela simplifiait vraiment beaucoup la structure de code.
    Autant je suis totalement d'accord pour les break et continue, autant pour les erreurs et des goto pas du tout...

    Un simple codage des erreurs incrémental (par exemple négatif), et un break ou un if suffit..

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    'faudrait surtout militer pour une réhabilitation propre et encadrée, dans les écoles, de l'usage du goto et autres artifices parce qu'ils ont beau être souvent révélateurs de mauvaises pratiques, ils sont loins d'être les abominations que l'on prétend.

    Je crois que c'est le bon moment pour placer ceci :
    Images attachées Images attachées  

  6. #6
    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
    encore une fois, je proteste par rapport aux goto, mais sinon effectivement "l'abomination des breaks et continue" va assez bien avec les règles du style "une fonction de pas plus de 50 lignes", "une fonction ne contenant qu'un if", "une fonction par fichier", et autres...

    Bref toutes choses dont l'application stricte , bien que vue de temps en temps dans les gros projets, n'en est pas moins une abomination de maintenance... et de programmation... (et quelques fois de conception)

    Mais nous sommes tous des c.ns, n'est-ce pas... et des c.ns remplaçables par d'autres c.ns..

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Il y a une grande différence entre les instructions entrainant la rupture du flux "normal" des instructions : d'une part break, continue et return et d'autre part goto. Pour les premières, on sait immédiatement où va se poursuivre l'exécution du programme sans avoir à explorer le reste du code. Il n'y a pas rupture pour le lecteur dans son examen du code et elles affectent donc beaucoup moins la lisibilité du code que ce que fait un goto.

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Pour moi il n'y a pas de différence, un goto n'est pas plus difficile à suivre qu'un break. Chercher une accolade fermante ou chercher un label, ça ne change pas grand chose, surtout si le nom du label est bien choisi.

    Je n'ai rien ni contre les break, ni contre les goto, à partir du moment où ils permettent de simplifier le code.

    C'est de toute façon un faux débat. Ce qui est important c'est la lisibilité du code, et la lisibilité du code vient avant tout de la clareté de l'algorithme, du choix du nom des variables, du découpage en blocs, des commentaires, de l'indentation, et de la constance des règles de programmation. Un code avec des breaks (et dans une moindre mesure des goto) peut être bien plus clair qu'un code sans.

  9. #9
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Il est à mon gout insensé de rajouter une variable ( surtout qu'il faut lui trouver un bon nom ) rien que pour éviter d'utiliser un break.

    J'ai toujours utilisé le break pour les cas à part dans le fonctionnement normal d'une boucle (une espèce d'erreur fatale qui survient par exemple).

    Quant au goto, assez rares sont les fois où son usage est judicieux.
    D'ailleurs les comparaisons des usages du goto et du break m'ont toujours étonné.

    Je rejoins quelques avis plus haut qui ne se privent pas de ces deux opérateurs quand cela rend le code plus clair.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Surtout que si on commence à supprimer break et continue parce qu'ils provoquent une rupture de séquence, il faudra supprimer return pour les mêmes raisons et laisser les fonctions courir jusqu'à leur terme.

    En soi, ça pourrait se plaider aussi. Mais dans ce cas, il faudra se rabattre complètement sur les if imbriqués qui, eux, sont décriés par d'autres personnes.

  11. #11
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par Obsidian Voir le message
    il faudra supprimer return pour les mêmes raisons et laisser les fonctions courir jusqu'à leur terme.
    Tout à fait, force 8 sur l'Echelle de Goret d'Emmanuel Delahaye, 3ème puce...

    A+

    Pfeuh

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Mouais, 'faut se méfier de ce genre de sites aussi, car crier bien fort et tourner d'emblée des concepts en ridicule avant d'en débattre, c'est souvent un bon moyen d'arriver à ses fins en évitant la confrontation. Il y a beaucoup de vrai dans ce site, mais :

    1. Je mets quiconque au défi d'écrire un programme qui évite 100 % des points cités sur cette page ;
    2. Il y a quand même beaucoup de points très contestables : interdiction d'utiliser float (mais interdiction d'utiliser long int également quand ce n'est pas nécessaire), interdiction d'écrire des fonctions de plus de 50 à 100 lignes, interdiction de passer une structure en argument de fonction, etc.


    Tous ces concepts ont été inventés et mis en place parce qu'ils ont une justification technique. Ils ne sont pas là pour servir de pommes de discorde, desquelles les programmeurs vertueux doivent s'efforcer de ne jamais s'approcher.

    Ce genre de directives va conduire le codeur à subdiviser son programme en une myriade de fonctions qui ne seront pas plus faciles à lire. Et personnellement, je considère qu'une fonction qui n'est appelée qu'à un seul endroit dans un programme a de fortes chances d'être injustifiée.

  13. #13
    Membre émérite
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ce genre de directives va conduire le codeur à subdiviser son programme en une myriade de fonctions qui ne seront pas plus faciles à lire. Et personnellement, je considère qu'une fonction qui n'est appelée qu'à un seul endroit dans un programme a de fortes chances d'être injustifiée.
    Yop,

    Je me permet de reprendre ce paragraphe pour y apporter une petite variation personnelle. Une fonction peut ne très bien être appelée qu'une seule fois dans un programme, mais il faut que celle-ci suive un cheminement logique et SOIT réutilisable dans un autre contexte en restant logique.

    C'est-à-dire qu'une fonction comme la suivante est pour moi inutile, et Obsidian sera d'accord avec moi :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void AfficherEntier(int entier){
        printf("%d\n",entier);
    }
    Mais au contraire une fonction comme celle-ci sera plus appréciée, avec un commentaire avant ou dedans:
    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
    int bin2dec(char *bin)   
    {
      int  b , k, n;
      int  len, sum = 0; 
     
      len = strlen(bin) - 1;
      for(k = 0; k <= len; k++) 
      {
        b = 1;
        n = (bin[k] - '0');
        b = b<<(len-k);
        sum = sum + n * b;
      }
      return(sum);
    }
    Car elle a une utilité simple: convertir une chaine binaire, en une valeur décimale. Et peut donc très bien être réutilisée dans un autre programme. (En respectant bien les tests sur la chaine envoyée (composée que de 1 et 0 , qu'elle fini bien par un '\0' etcetc...) )

    ++

    Fiki

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    A titre tout à fait personnel, je dois dire que je préfères bien souvent essayer de limiter l'utilisation de break aux tests à choix multiples (switch, case)...

    Il y a une raison bien simple à cet état de fait : j'ai toujours un doute quant à savoir où le break va me renvoyer, alors que si je teste une variable, je sais exactement quelle partie du code sera exécutée si la condition est remplie et quelle autre ne le sera pas.

    De plus, le fait de disposer de variable clairement identifiée dont on peut, le cas échéans, vérifier la valeur lors du debug présente, selon moi, l'intérêt certain de pouvoir "tracer" d'une manière ou d'une autre cette valeur.

    Par contre, bien que j'essayerai dans la mesure du possible de mettre en oeuvre le SESE (Single Entry Single Exit), je n'éprouverai pas la moindre difficulté morale à placer un return en milieu de fonction si la logique est capable de repérer le fait que rien de ce qui suit ne sera exécuté / exécutable.

    En d'autre mots, je pourrais dire que j'utilise:
    • régulièrement return ailleurs qu'en fin de fonction
    • rarement break ailleurs que dans un test à choix multiple (où l'on n'a de toutes façons pas vraiment le choix)
    • encore plus rarement continue
    • jamais gogo
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. [pl/pgSQL 7.2] Returns Opaque?
    Par Gruik dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 18/10/2003, 16h50
  2. return ();exit() ;
    Par Zazeglu dans le forum C
    Réponses: 12
    Dernier message: 10/10/2003, 20h56
  3. [C#] Changer le focus avec la touche return
    Par sblanc74 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/10/2003, 18h38
  4. return
    Par drKzs dans le forum C
    Réponses: 3
    Dernier message: 18/09/2003, 22h36
  5. [LG]Pause de programme ou Break time
    Par lvdnono dans le forum Langage
    Réponses: 11
    Dernier message: 17/05/2003, 17h23

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