(java)Pourquoi les break c'est mal ?

Fermé
Balthazar2 Messages postés 138 Date d'inscription mardi 16 octobre 2012 Statut Membre Dernière intervention 29 janvier 2016 - 26 avril 2014 à 06:52
Balthazar2 Messages postés 138 Date d'inscription mardi 16 octobre 2012 Statut Membre Dernière intervention 29 janvier 2016 - 26 avril 2014 à 19:48
Bonjour, Je me souviens il y a longtemps, dans mon premier cours de programmation, il fallait dans un des exercices générer 6 nombres aleatoires sans doublons et éviter les comparaisons inutile (Dès que 2 nombres identique sont repéré, inutile de continuer les comparaisons jusqu'au bout, logique :p )

J'avais 2 boucle for imbriqué pour que chaque nombre soient comparé avec tout ceux qui le suivent et pour qu'il s'arrête dès qu'il trouve un doublon, je me souviens avoir fais un truc de flemmard dans ce genre là

if(tabNb[i] == tabNb [j+1])
{
doublon = true;
break;
}

Mon prof a fait la gueule quand il a vu ça et a tenu à ce que je modifie mon algorithme de comparaison.

J'ai fais à la place


while(i < 6 && continuer)
{
instructions
while(j<5 && continuer)
{
instructions
}
}

et là il était content.

Pourquoi tant de haine envers ce pauvre break ?
A voir également:

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
26 avril 2014 à 11:14
Bonjour,

Personnellement les
break
et les
continue
je les utilises très souvent !

En fait, c'est surtout que l'on essaye de vous apprendre un paradigme, l'orienté objet, alors que ces instructions appartiennent plutôt à la programmation impérative.
C'est donc une "interdiction" purement pédagogique, probablement de mauvaise foi, car dans un vrai code tu n'auras jamais de
while (continuer &&
tu feras un break, voire un return. Parce que ça coûte moins cher en calculs. Comparons :

// Code 1

boolean negatif = false;

for (int i=0, n=tabNb.length; i<n && !negatif; i++)
{
    if (tabNb[i] < 0)
        negatif = true;
}

// Code 2

boolean negatif = false;

for (int i=0, n=tabNb.length; i<n; i++)
{
    if (tabNb[i] < 0)
    {
        negatif = true;
        break;
    }
}

Ce qui coûte plus cher dans le premier code, c'est de devoir faire tout les tests
&& !negatif
ça peut paraître insignifiant vu que ce n'est qu'un booléen, mais il est testé à chaque fois, et ce en plus du test
if
. Alors qu'avec le break, on ne fait que le
if
pour arrêter la boucle immédiatement (alors que dans le premier code, l'instruction i++ aurait été effectué une dernière fois avant de faire le test !negatif).
Ici c'est un exemple simple, mis si tu as plusieurs conditions de boucles dans ton code, tu devrais faire des
&& !toto && !titi && !tata
ce qui en plus de rajouter des tests inutiles à faire, rende le code difficile à maintenir.

L'absurdité de se refuser à mettre des break, est d'autant plus grande qu'en Java l'une des boucles les plus utilisées est le for each, c'est à dire un for qui itère toutes les valeurs d'un tableau, d'une liste etc. du début à la fin sans condition supplémentaire. C'est la boucle la plus orientée objet de Java puisqu'elle se base directement sur les méthodes de l'interface Iterable, et c'est également la seule à ne pouvoir être contrôlée qu'avec des break et des continue (la bidouille de rajouter des booléens comme conditions de boucle ne pourra pas être utilisée ici)

// Code 3

boolean negatif = false;

for (int v : tabNb)
{
    if (v < 0)
    {
        negatif = true;
        break;
    }
}

Alors un conseil : si tu veux une bonne note à ton exam, fais comme ton prof te dit, parce qu'il s'agit avant tout d'un cours sur les concepts de programmation, pas sur les possibilités du langage en particulier.
C'est un peu comme faire des boucles en Lisp, on peut le faire, mais dans un cours de programmation fonctionnelle c'est "interdit" car ça ne correspond pas au paradigme...
1
Balthazar2 Messages postés 138 Date d'inscription mardi 16 octobre 2012 Statut Membre Dernière intervention 29 janvier 2016 2
26 avril 2014 à 18:02
c'était avant de faire de la POO ce truc, nos outils étaient assez limités :D

De toute façon il me semble que pour avoir des nombres différents on ne fais jamais de boucle qui génère une nouvelle sélection au moindre doublon.

Je sais qu'il existe des algorithme déterministes pour ça, mais je n'ai jamais vraiment compris le principe, c'est un truc qu'on enseigne pas dans le b.a.-ba :D
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
26 avril 2014 à 19:22
Si je comprends bien, tu ne t'intéresses pas vraiment au break, mais plutôt à l'algorithme spécifique de recherche de doublon ? Dans ce cas poses une autre question sur le forum, on va dire que cette discussion concerne uniquement l'utilisation ou non, du break, dans un cas très général.

Après, POO ou pas, le résultat est le même. Java fournit l'instruction break, ce n'est pas juste pour faire joli. D'ailleurs dans la page du tutoriel officiel Branching Statements - The break Statement leur exemple est un code un peu similaire au tien (algorithmiquement au moins)

public static void main(String[] args) {

    int[][] arrayOfInts = { 
        { 32, 87, 3, 589 },
        { 12, 1076, 2000, 8 },
        { 622, 127, 77, 955 }
    };
    int searchfor = 12;

    int i;
    int j = 0;
    boolean foundIt = false;

search:
    for (i = 0; i < arrayOfInts.length; i++) {
        for (j = 0; j < arrayOfInts[i].length; j++) {
            if (arrayOfInts[i][j] == searchfor) {
                foundIt = true;
                break search;
            }
        }
    }

    if (foundIt) {
        System.out.println("Found " + searchfor + " at " + i + ", " + j);
    } else {
        System.out.println(searchfor + " not in the array");
    }
}
0
MrYAU31 Messages postés 3808 Date d'inscription samedi 23 février 2013 Statut Membre Dernière intervention 8 juillet 2017 1 611
Modifié par MrYAU31 le 26/04/2014 à 07:06
Bonjour,

Tout simplement parce qu'un break stoppe une boucle en cours de route.
Ce n'est pas que c'est mal, juste que cela veut souvent dire que la boucle est mal pensée et que le code est fait à la va vite.
De plus, en cas de débogage, les break peuvent rendre difficile l'analyse du code et du comportement du programme.
0
Balthazar2 Messages postés 138 Date d'inscription mardi 16 octobre 2012 Statut Membre Dernière intervention 29 janvier 2016 2
26 avril 2014 à 19:48
Si je comprends bien, tu ne t'intéresses pas vraiment au break, mais plutôt à l'algorithme spécifique de recherche de doublon ? Dans ce cas poses une autre question sur le forum, on va dire que cette discussion concerne uniquement l'utilisation ou non, du break, dans un cas très général.

Si si, mais à autre chose par la suite. Désolé si ce n'était pas approprié
0