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

Langage Java Discussion :

Itération/recherche, meilleure façon de faire?


Sujet :

Langage Java

  1. #21
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Citation Envoyé par mavina Voir le message
    Il y a un cas (et ce mot est bien choisi) où le break est inévitable et pourtant le principe en est strictement le même...
    Cite le, on est là pour apprendre... Tu ne fais pas avancer le débat en disant qu'il y en a un sans le citer.
    Il est peut être fait allusion au cas du switch :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    switch(var){
    case '1' : {... ; break;}
    case '2' : {... ; break;}
    ...
    }
    Là je pense que le break est plus que indispensable.

    Edit : grillée

  2. #22
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		PosteBudgétaire posteBudgétaire = null;
    		Iterator ite = postes.iterator();
    		while(ite.hasNext()){
    			posteBudgétaire = (PosteBudgétaire) ite.next();
    			if( posteBudgétaire.getLabel().compareToIgnoreCase(s)==0 ){
    				break;
    			}
    		}
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		PosteBudgétaire posteBudgétaire = null;
    		boolean trouvé = false;
    		Iterator ite = postes.iterator();
    		while(ite.hasNext() && !trouvé){
    			posteBudgétaire = (PosteBudgétaire) ite.next();
    			if( posteBudgétaire.getLabel().compareToIgnoreCase(s)==0 ){
    				trouvé = true;
    			}
    		}
    On en revient au premier message... Quelle est l'écriture la plus lisible ?
    En plus avec cette écriture on appelle une fois de trop hasNext(). Il faudrait plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(!trouvé && ite.hasNext()){

  3. #23
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Ah mais on sort du contexte boucle là, vous êtes tous des fourbes

    C'est sur, ce break là fait partie de la sémantique du switch, ils sont indissociables ...

    F.

  4. #24
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mavina Voir le message
    Ah mais on sort du contexte boucle là, vous êtes tous des fourbes
    c'est pas faux

    Mais bon, franchement, je ne vois pas ce qui gêne avec le break...
    ça me rappel les discussions à l'époque des goto dans tous les sens, mais c'était des programmes linéaires avec 300 lignes de code...
    Là, effectivement, goto vers le bas et goto vers le haut, très vite, on ne sait plus où on est...

    Dans tous les cas, c'est vouloir être plus royaliste que le roi, parce qu'en langage machine, il n'y a que ça à l'arrivée, non ?

  5. #25
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Ah oui, mais si tu veux faire du langage machine ne fais pas de java

    Quoi qu'il en soit, je préfère faire une condition d'arret en plus que de faire un break, et celà revient au même

    Chacun ses tics de programation

    F.

  6. #26
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    Citation Envoyé par mavina Voir le message
    Ah oui, mais si tu veux faire du langage machine ne fais pas de java

    Quoi qu'il en soit, je préfère faire une condition d'arret en plus que de faire un break, et celà revient au même

    Chacun ses tics de programation

    F.

    Ah... tu as enfin dit ce que je voulais que tu dises et qui réponds à la question du premier post : il s'agit de préférences de programmation.

    Ceux qui sont allergiques aux return multiples et aux break
    ne les utilisent pas et ceux qui trouvent que ça simplifie les choses et allège le code n'ont pas à s'en priver.


    Donc, faites comme vous voulez tant que ça n'irrite pas trop vos collègues parce qu'ils ne sont pas du même avis, s'ils doivent travailler sur le même code que vous. Mais dans ce cas il y a une mauvaise répartition des tâches à la base.

  7. #27
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Tant que c'est commenté...

    Et non ca ne répond pas au premier post, ce qui répond au premier post, c'est "code numéro 2, car le code numéro 1 continue d'itérer et ce malgré le fait qu'il ai trouvé ce qu'il doit retourner", mais je chipote bien sûr

    F.

  8. #28
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 627
    Points : 15 788
    Points
    15 788
    Par défaut
    Pour moi le break tout comme continue et return sont des instructions bien utile qu'il ne faut surtout pas avoir peur d'utiliser. Je trouve que contrairement à ce que certains disent ils rendent les programmes bien plus lisibles.

    break ne doit pas être employé en début ou fin de boucle while bien évidement.
    Par contre rajouter un booléen pour eviter un break comme dans l'exemple donné n'est pas plus lisible à mon avis, et dans certain cas, ça peut devenir carrément moche.
    En effet on continue l'execution inutile d'une boucle. Pour peu que la boucle effectue plusieurs opérations à la suite, toutes les opérations suivantes devraient soit être exécutées pour rien soit être placées dans un if

    break et continue permettent d'éviter d'avoir trop de if imbriqués qui sont à mon avis une des principales cause de code pas clair.

    je trouve que un code du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(MonObjet obj : listeObjets){
        if (!obj.isValide() ) {
            System.out.println("Erreur: données invalides");
            break;
        }
        if (!obj.isTraitable() ) {
            System.out.println(obj+" non traité");
            continue;
        }
        obj.traitement();
        System.out.println(obj+" traité");
     
    }
    est autrement plus clair que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for(MonObjet obj : listeObjets){
        boolean valide = obj.isValide();    
        if (valide){
            boolean traitable = obj.isTraitable();
            if(traitable){
                obj.traitement();
                System.out.println(obj+" traité");
            } else {
                System.out.println(obj+" non traité");
            }
        }else{
            System.out.println("Erreur: données invalides");
        }
    }

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Uther Voir le message
    Pour moi le break tout comme continue et return sont des instructions bien utile qu'il ne faut surtout pas avoir peur d'utiliser. Je trouve que contrairement à ce que certains disent ils rendent les programmes bien plus lisibles.

    break ne doit pas être employé en début ou fin de boucle while bien évidement.
    Par contre rajouter un booléen pour eviter un break comme dans l'exemple donné n'est pas plus lisible à mon avis, et dans certain cas, ça peut devenir carrément moche.
    En effet on continue l'execution inutile d'une boucle. Pour peu que la boucle effectue plusieurs opérations à la suite, toutes les opérations suivantes devraient soit être exécutées pour rien soit être placées dans un if

    break et continue permettent d'éviter d'avoir trop de if imbriqués qui sont à mon avis une des principales cause de code pas clair.

    je trouve que un code du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(MonObjet obj : listeObjets){
        if (!obj.isValide() ) {
            System.out.println("Erreur: données invalides");
            break;
        }
        if (!obj.isTraitable() ) {
            System.out.println(obj+" non traité");
            continue;
        }
        obj.traitement();
        System.out.println(obj+" traité");
     
    }
    est autrement plus clair que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for(MonObjet obj : listeObjets){
        boolean valide = obj.isValide();    
        if (valide){
            boolean traitable = obj.isTraitable();
            if(traitable){
                obj.traitement();
                System.out.println(obj+" traité");
            } else {
                System.out.println(obj+" non traité");
            }
        }else{
            System.out.println("Erreur: données invalides");
        }
    }
    non !! je ne suis pas d'accord ; pour moi le second est plus lisible.
    surtout si celui qui n'est pas familiarisé avec break et continu reprends ton code. L'avantage de ne pas utiliser ces instructions, c'est flagrant dans ton exemple, est que le code est bien divisé en blocs. Avec le continu, une suite d'instruction qui au premier coup d'œil devrait être n'exécute ne le sera en fait peut être pas...
    je préfère imbriquer 2 if et avoir un code dont le fonctionnement "saute aux yeux" qu'utiliser ces raccourcis syntaxiques assez ambigus.

  10. #30
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 627
    Points : 15 788
    Points
    15 788
    Par défaut
    surtout si celui qui n'est pas familiarisé avec break et continu reprends ton code. L'avantage de ne pas utiliser ces instructions, c'est flagrant dans ton exemple, est que le code est bien divisé en blocs. Avec le continu, une suite d'instruction qui au premier coup d'œil devrait être n'exécute ne le sera en fait peut être pas...
    Si tu ne connais pas break et continue, c'est que tu ne connait pas les bases même du langage. Ce genre de chose ne devrait surprendre personne.

    je préfère imbriquer 2 if et avoir un code dont le fonctionnement "saute aux yeux" qu'utiliser ces raccourcis syntaxiques assez ambigus.
    On a pas la même notion de saute au yeux alors. Avec des if, la détection et le taitement sont a l'opposé dans le code. Ici il n'y a que des instruction d'une ligne donc, ca reste assez lisible mais si tu fait plusieurs test qui tiennent sur plusieurs lignes les imbrications vont devenir très lourdes.

  11. #31
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    Là dessus je suis d'accord car même si je le trouve bien pratique et que je l'utilise moi aussi, l'utilisation du continue rend forcément le code plus ambigüe contrairement au break.

    Je ne dis pas qu'il est à proscrire, bien au contraire, mais chaque utilisation de ce mot réservé doit être commenté. Et comme le fait de devoir écrire un commentaire à chaque fois enlève l'argument de rapidité cela fera moins d'adeptes de la chose.
    Par contre, théoriquement si c'est utilisé systématiquement à de nombreux endroits du code d'un programme c'est sensé en augmenter les performances puisque l'on utilise une instruction proche d'une instruction machine qui réduit le nombre de if.
    Dans la plupart des programmes ce sera sans effet, mais dans certains cas ça peut être visible.

  12. #32
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    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
     
    for(MonObjet obj : listeObjets){
        boolean valide = obj.isValide();    
        if (valide){
            boolean traitable = obj.isTraitable();
            if(traitable){
                obj.traitement();
                System.out.println(obj+" traité");
            } else {
                System.out.println(obj+" non traité");
            }
        }else{
            System.out.println("Erreur: données invalides");
        }
    }
    d'un coté, tu n'es pas très objectif, ce code peut être très lisible, sans utiliser break et continue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	for(MonObjet obj : listeObjets){
    		if (!obj.isValide()){
    			System.out.println("Erreur: données invalides");
    		}
    		else if(!obj.isTraitable()){
    			System.out.println(obj+" non traité");
    		} 
    		else {
    			obj.traitement();
    			System.out.println(obj+" traité");
    		}
    	}

  13. #33
    Membre confirmé Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Points : 519
    Points
    519
    Par défaut
    C'est pour ça qu'il ne faut pas généraliser : au cas par cas il faut avoir le réflexe d'utiliser l'une ou l'autre des solutions.

    Romain B. a bien montré que parfois il suffit d'une simple optimisation du code.

    Par contre, le break est quant à lui très utile lorsque le nombre de boucles imbriquées devient vraiment trop important, mais ce n'est pas dans un exemple de quelques lignes que l'on en viendra à ce degré de complexité à moins de vraiment le faire exprès. Et dans ce dernier cas il y a toujours moyen de remanier les tests conditionnels afin de clarifier les choses.

  14. #34
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Ça risque de virer au troll... je pense qu'il faudrait conclure...

    Pour ma part, je dirais que la seule chose à proscrire c'est d'interdire ou de faire croire que c'est "mal".
    Il ne s'agit pas non plus de "convertir", chacun ses habitudes, dans certains cas c'est mieux et plus lisible et il ne faut pas s'en priver.

    Bye

  15. #35
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 627
    Points : 15 788
    Points
    15 788
    Par défaut
    d'un coté, tu n'es pas très objectif, ce code peut être très lisible, sans utiliser break et continue :
    Oui c'est vrai que mon exemple n'est pas bon vu qu'ici on est pas obligé d'imbriquer les if les un dans les autre et que les test et traitements ce font en une ligne.
    Ceci dir parfois, à refuser de faire break et continue, on ce retrouve avec des niveaux d'imbrications inutiles et quand les code commencent a ralonger, ca peut être moche.

Discussions similaires

  1. La meilleur façon de faire une recherche ?
    Par Jcpan dans le forum PL/SQL
    Réponses: 21
    Dernier message: 06/10/2008, 11h25
  2. Réponses: 16
    Dernier message: 18/08/2008, 19h29
  3. Réponses: 8
    Dernier message: 18/01/2008, 16h58
  4. Réponses: 1
    Dernier message: 08/08/2007, 09h45
  5. Est ce bien la meilleure façon de faire un histogramme ?
    Par rvzip64 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 10/05/2005, 13h41

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