et tu sors de la boucle en faisant un break ;Envoyé par ®om
Note du modérateur : ces messages proviennent d'un autre message ( Thread, Arrête toi je le veux !) et ont été déplacé car ils étaient Hors-Sujet
Envoyé par Kikito
et tu sors de la boucle en faisant un break ;Envoyé par ®om
Note du modérateur : ces messages proviennent d'un autre message ( Thread, Arrête toi je le veux !) et ont été déplacé car ils étaient Hors-Sujet
Envoyé par Kikito
pfiou... C'est pas propreEnvoyé par schniouf
break est réservé aux switch![]()
Non, pas du tout, break peut être utilisé partout où on a besoin de sortir prématurément d'une boucle (while, for), pas seulement les switchEnvoyé par ®om
Oui, java le supporte...Envoyé par manblaizo
Après, ça n'est pas parce que ça marche que c'est correct...
(c'est une des premières choses qu'on apprend en cours de java, ne surtout pas utiliser break et continue, sauf break dans un switch)
C'est quoi ta méthode pour sortir d'un boucle (for ou while) alors ?Envoyé par ®om
donc si je comprend bien pour une boucle for de i=1 à i=10, tu fais i=11, et pour while tu t'arranges pour que la condition soit fausse.Envoyé par ®om
C'est bien, mais dans ce cas là :
Instructions 2 est exécuté quand même. L'avantage du break c'est qu'on sort de la boucle tout de suite. Ou alors j'ai mal compris ta méthode
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 for( int i=0 ; i<=10 ; i++ ) { ... // Instructions 1 if( condition ) i = 11 ; ... // Instructions 2 }.
Tu es sûr de ne pas confondre avec un autre langage ? Parce que ça, je l'ai jamais lu nulle part, même pas dans la spécification.Envoyé par ®om
Si tu as besoin de faire ça, c'est que tu as mal conçu ton algorithme...Envoyé par schniouf
En gros, si tu veux par exemple parcourir un tableau et t'arrêter quand tu trouves le résultat recherché, tu fais:
Si tu as des "//instructions 2" comme dans ton exemple (ce qui ne se présente que dans des cas particuliers - souvent tu peux réorganiser pour faire différemment-), il faut refaire un if(condition) { //instructions 2 } où condition est équivalente à la condition de ton while/for...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int i = 0; boolean contains = false; while(i < tab.length && !contains) { if(tab[i].equals("tachaine")) { contains = true; } i++; }
ça n'est pas spécifique au Java, c'est les "bases" de l'algorithmique, que l'on doit appliquer en Java, en C, etc...Envoyé par manblaizo
Mais tu sais que tous les mots clé n'ont pas toujours la même signification d'un langage à un autre, et justement en Java, break et continue permettent de sortir d'une boucle sans avoir à exécuter les instructions suivantes dans la boucle. C'est ce qui est fait aussi dans un switch, s'il n'y a pas de break, toutes les instructions "case" suivantes sont exécutées jusqu'au premier break rencontré. Donc en principe ce comportement n'est pas lié à l'algorithmique mais bien à l'implémentation propre de chaque langage de programmation.Envoyé par ®om
Justement, en algorithmique, il est impossible d'exprimer un break/continue. Donc il ne "faut pas" les utiliser non plus dans les langages.Envoyé par manblaizo
Sinon, break/continue, quelque soit le langage, à ma connaissance ça a le même sens...
Envoyé par ®om
Ca marche très bien et je ne vois pas en quoi ce n'est pas propre. Après c'est vrai que j'ai appris à programmer de la manière dont tu le dis, mais bon. Le truc que je trouve vraiment dégueu c'est les goto
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public boolean contient() { int i = 0; while(i < tab.length) { if(tab[i].equals("tachaine")) return true; i++; } return false ; }
EDIT : on est en train de lui pourrir son post avec nos théories, vaudrait mieux arrêter ou bien ouvrir un nouveau post![]()
Là ça va, c'est un return, c'est pas un break... C'est moins correct qu'en le mettant à la fin, mais c'est plus acceptable qu'un break...Envoyé par schniouf
Voilà pourquoi... Un élément essentiel dans le développement de logiciels, c'est la maintenance. Et là, imagine tu dois modifier la méthode, pour traiter le résultat (plutôt que de le retourner), tu vas être obligé de modifier ta boucle (tu vas me dire, sur cet exemple, c'est pas coûteux), alors que si tu fais le return qu'à la fin, bah tu laisses ta boucle telle quelle...
Le problème du break/continue est aussi un problème de maintenance...
Imagine tu dois faire un traitement particulier...
Et en fait plus tard, tu veux rajouter une boucle "interne"...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for(int i = 0; i < tab.length; i++) { if(isOK(tab[i], 5) { //isOK caractéristique quelconque dépendante de l'entier passé en paramètre, qui renvoie un booléen break; } }
Et bien tu es obligé de refaire totalement ta boucle, car le break s'applique maintenant sur la boucle en j...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 for(int i = 0; i < tab.length; i++) { for(int j = 0; j < tab2.length; j++) { if(isOK(tab[i], j) { //isOK caractéristique quelconque dépendante de l'entier passé en paramètre, qui renvoie un booléen break; } } }
Dans ce cas j'suis d'accord. Je m'incline.
Je reviens à l'histoire du break/continue, même si on peut trouver ça moins propre, je leur trouve des utilités:
- sortir ou continuer la boucle sur un evenement bloquant sur lequel on ne veut pas lever d'exception, je ne trouve pas ça terrible de transformer ces boucles for dont le nombre d'itérations est voulu à une boucle while
- dans les boucles complexes où on gagne beaucoup en lisibilité et en maintenance ( que tu cites dans l'autre sens ), car avec tous les if else que ça peut rajouter ça devient vite illisible.
devient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 for (int i=0;i<10;i++){ toto = fonction(tab[i]); if (toto < 5){ toto2 = fonction2(toto); if (toto2 == 0){ break; } fonction4(toto2); } fonction3(toto,toto2); }
La c'est encore relativement simple, mais avec des boucles plus complexes les break/continue font vraiment gagner en lisibilité Et en maintenance.
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 int i=0; boolean b = true; while (i<10 && b){ toto = fonction(tab[i]); if (toto < 5){ toto2 = fonction2(toto); if (toto2 == 0){ b = false; } else{ fonction4(toto2); } } if (b){ fonction3(toto,toto2); } i++; }
Qu'en penses les autres rédacteurs/modérateurs java ?
J'ajouterai :
1) Les break/continue sont utilisés de manière assez importante dans les sources java (et pas que pour les switch)
2) Pour rom le break casse les deux boucles dans ton exemple, et il est possible de mettre un label à tes itérations et c'est également pas mal utilisé dans les sources java ( ça je ne le fait pas mais c'est juste pour la petite histoire ) :
Voici readline de BufferedReader par exemple (et y en a beaucoup beaucoup d'autres) :
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
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 String readLine(boolean ignoreLF) throws IOException { StringBuffer s = null; int startChar; boolean omitLF = ignoreLF || skipLF; synchronized (lock) { ensureOpen(); bufferLoop: for (;;) { if (nextChar >= nChars) fill(); if (nextChar >= nChars) { /* EOF */ if (s != null && s.length() > 0) return s.toString(); else return null; } boolean eol = false; char c = 0; int i; /* Skip a leftover '\n', if necessary */ if (omitLF && (cb[nextChar] == '\n')) nextChar++; skipLF = false; omitLF = false; charLoop: for (i = nextChar; i < nChars; i++) { c = cb[i]; if ((c == '\n') || (c == '\r')) { eol = true; break charLoop; } } startChar = nextChar; nextChar = i; if (eol) { String str; if (s == null) { str = new String(cb, startChar, i - startChar); } else { s.append(cb, startChar, i - startChar); str = s.toString(); } nextChar++; if (c == '\r') { skipLF = true; } return str; } if (s == null) s = new StringBuffer(defaultExpectedLineLength); s.append(cb, startChar, i - startChar); } } }
Dommage que ce sujet n'intéresse personne, j'aurais bien aimé avoir l'avis d'un certain nombre de développeurs concernant l'utilisation des break/continue.
Moi je suis pourEnvoyé par Kikito
!!!
Je ne sais pas quelles sources tu regardes... mais elles ne doivent pas être très propres...Envoyé par Kikito
Partager