OVH Cloud OVH Cloud

appréhension sur les "break"

26 réponses
Avatar
Lightness1024!
Salut tous.
En lisant certains messages j'ai remarqué avec un certain étonnement que
plusieurs personnes ont l'air de ne pas trop aimer l'instruction break.
-je pense qu'ils doivent penser la meme chose pour continue-
Je dit que ca m'etonne car jusqu'ici j'avais plutot l'habitude de m'en
servir relativement souvent (pour sortir des boucles je parle. pas
uniquement dans les switch).

En fait étant donné que ce n'est pas souvent que je remet en question ma
facon de programmer, et que c'est peut etre un manque (?), je me dit
voila l'occasion de reflechir un peu, mais pas tout seul. alors voila je
vous demande:

Qu'est-ce que vous, très personnellement, vous pensez de break ?
et aussi, qu'est-ce que vous en pensez tres objectivement ? (Quelle
devrait etre la maniere générale de s'en servir)

j'ajoute quand meme quelques details:
apparament sa s'approche un peu de l'utilisation des boucles et demies,
la aussi comme j'ai lu des critiques qui divergaient un peu j'ai essayé
de regarder le problème d'encore plus loin:
dans un langage (ici le C++) on met a notre disposition un jeu
d'instructions. c'est bien. heureusement avec il y a une notice
d'utilisation. c'est ce qui va nous permettre de réaliser des
algorithmes, pour modéliser des réactions logiques en fonction de causes
(variables).
Et vu de la on se dit alors, puisqu'on a cet outil a disposition, en
fait, n'importe comment que l'on dispose nos instructions, si
l'algorithme est réalisé on a atteind le but recherché.
si on a que ca, alors tout est permi.
si on ajoute une restriction d'optimisation et de temps de frappe
(économie du nombre de lignes) alors on arrive a un modele de
programmation qui dépendrait de la maniere de penser de chaque personne.
reste alors le critere de lisibilité, c'est lui qui est mis en question
dans ce thread finallement non ?
c'est pour ce dernier et unique critere que break est des fois accepté
et des fois non ? pas vrai ? vous pensez que j'ai raison ?
est-ce que ce critere là est-il finalement pas un bridage de l'esprit
des programmeurs ?

bon j'espere que vous allez pas me prendre pour un troll, moi je me pose
certaines question, si je cherche a répondre tout seul je risque de pas
prendre les bonnes directions, alors voila je fait appel a vous, merci.






--
------------------------------------------------------------------------

Lightness1024! ProgrammatO E.U.R.L.
http://www.lightness.fr.st

6 réponses

1 2 3
Avatar
Loïc Joly
Alexandre wrote:

une solution du genre :

bool bSortir = false;
while(!bSortir)
{
if( test_condition_de_bord)
bSortie = true;
else if(test_autre_condition_de_sortie)
bSortie = true;
// etc... qq else if sur chaque test qui peut mettre fin à la boucle
else
{...} // ici le code executé dans la boucle
}

plus propre,
Ah ?


certes, lisible même avec 36 else if... j'aime assez ;-)
Evidement, ici c'est brut mais ce type de truc évite la plupart du temps
break/continue et les imbrications, peu lisibles il est vrai.

Pour moi, break c'est de l'assembleur ;-) on dirait presque un goto / JMP.
A éviter, à mon avis.


Je ne vois pas en quoi le code que tu as posté est préférable à un break
: Dans les deux cas, on est obligé de lire le contenu de la boucle pour
savoir ses conditions de sorties, c'est plus lourd à écrire, ça demande
des variables de plus, ya plein d'imbriquations...


bool foundData = false;
bool invalidEntry = false;
while(!invalidEntry && !foundData)
{
if( test_condition_de_bord)
foundData = true;
else if(test_autre_condition_de_sortie)
invalidBuffer = true;
else
{...} // ici le code executé dans la boucle
}

Alors j'admet que ce code peut présenter des avantages par rapport à du
break (encore que l'imbrication des if est peu élégante à mon goût)).

C'est pour ça que je ne fais pas souvent de switch, j'aime pas trop comme il
est implémenté.


Comment sais-tu comment switch est implémenté ?

Et pi y marche que sur des int.


Euh, pas vraiment, même si effectivement il ne marche pas pour tout, il
permet bien d'autres types que des int.

--
Loïc

Avatar
Christophe Lephay
Alexandre wrote:
"Marc Espie" a écrit dans le message de
Il y a aussi toutes ces boucles ou la condition d'arret s'exprime au
milieu de la boucle qui donnent naturellement des

while (1) {
debut_de_boucle();
if (cond)
break;
fin_de_boucle();
}
<snip>


une solution du genre :

bool bSortir = false;
while(!bSortir)
{
if( test_condition_de_bord)
bSortie = true;
else if(test_autre_condition_de_sortie)
bSortie = true;
// etc... qq else if sur chaque test qui peut mettre fin à la
boucle else
{...} // ici le code executé dans la boucle
}

plus propre, certes, lisible même avec 36 else if... j'aime assez ;-)
Evidement, ici c'est brut mais ce type de truc évite la plupart du
temps break/continue et les imbrications, peu lisibles il est vrai.

Pour moi, break c'est de l'assembleur ;-) on dirait presque un goto /
JMP. A éviter, à mon avis.
C'est pour ça que je ne fais pas souvent de switch, j'aime pas trop
comme il est implémenté. Et pi y marche que sur des int.


Ceci dit, ta solution ne fait pas la meme chose que ce dont parle Marc. Avec
ton approche, son code se réécrirait :

bool bSortir = false;
while( !bSortir )
{
debut_de_boucle();
bSortir = cond; // remplacer cond par...
if( !bSortir )
{
fin_de_boucle();
}
}

Je ne trouve pas que la solution que tu proposes offre un gain de lisibilité
si évident que ça. Et ça empire si on a d'autres conditions de sorties :

bool bSortir = false;
while( !bSortir )
{
debut_de_boucle();
bSortir = cond1;
if( !bSortir )
{
milieu_de_boucle();
bSortir = cond2;
if( !bSortir )
{
fin_de_boucle();
}
}
}

à comparer avec :

while( 1 )
{
debut_de_boucle();
if( cond1 ) break;
milieu_de_boucle();
if( cond2 ) break;
fin_de_boucle();
}

Personnellement, je trouve la boucle plus lisible avec les breaks dans ce
cas précis...

Chris


Avatar
Serge Paccalin
Le jeudi 13 novembre 2003 à 00:03, Christophe Lephay a écrit dans
fr.comp.lang.c++ :

à comparer avec :

while( 1 )
{
debut_de_boucle();
if( cond1 ) break;
milieu_de_boucle();
if( cond2 ) break;
fin_de_boucle();
}

Personnellement, je trouve la boucle plus lisible avec les breaks dans ce
cas précis...


J'ai déjà vu (vu, pas écrit) du code qui utilisait une fausse boucle
juste pour pouvoir se servir de break :

do
{
traitement_1();
if (bSortir)
break;

traitement_2();
if (bSortir)
break;

traitement_3();
if (bSortir)
break;

traitement_4();

} while (0);


--
___________ 2003-11-13 09:11:26
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Avatar
amerio
J'ai déjà vu (vu, pas écrit) du code qui utilisait une fausse boucle
juste pour pouvoir se servir de break :

do
{
traitement_1();
if (bSortir)
break;

traitement_2();
if (bSortir)
break;

traitement_3();
if (bSortir)
break;

traitement_4();

} while (0);


Ca ressemble furieusement à un try/throw/catch local.
Si c'est pour compenser sur un vieux compilo, pourquoi pas ?
Ou bien dans un innerloop, là où lever une exception serait trop couteux...
(un break ne coute rien comparé à un try/catch)

Perso, je pense qu'il faut etre pragmatique, et non dogmatique.
On va vite vers la guerre de religion, sinon.
(mais les dogmes ont du bon, aussi, hein ! :->)

Avatar
Lightness1024!
amerio wrote:
Perso, je pense qu'il faut etre pragmatique, et non dogmatique.
On va vite vers la guerre de religion, sinon.
(mais les dogmes ont du bon, aussi, hein ! :->)



lol, interressant :)

--
------------------------------------------------------------------------

Lightness1024! ProgrammatO E.U.R.L.
http://www.lightness.fr.st

Avatar
Christophe Lephay
amerio wrote:
Perso, je pense qu'il faut etre pragmatique, et non dogmatique.
On va vite vers la guerre de religion, sinon.
(mais les dogmes ont du bon, aussi, hein ! :->)


Les dogmes n'ont du bon que si on est pragmatique...

Chris

1 2 3