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. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 36
    Points : 25
    Points
    25
    Par défaut Itération/recherche, meilleure façon de faire?
    Bonsoir tout le monde,

    Il y'a une question qui me trotte dans la tête depuis un moment. Voilà je fais par habitude mes recherches ou autres itérations de la façon suivante :

    1:

    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
     
    public PosteBudgétaire getPoste(String s){
    		boolean trouvé=false;
    		PosteBudgétaire posteBudgétaireARetourner=null;
    		PosteBudgétaire posteBudgétaire;
    		Iterator ite = postes.iterator();
    		while(ite.hasNext() && !trouvé){
    			posteBudgétaire = (PosteBudgétaire) ite.next();
    			if( posteBudgétaire.getLabel().compareToIgnoreCase(s)==0 ){
    				trouvé=true;
    				posteBudgétaireARetourner=posteBudgétaire;
    			}
    		}
    		return posteBudgétaireARetourner;
    	}
    Il me semblait qu'un professeur m'avait recommandé de ne jamais mettre plusieurs return. Pourtant en réfléchissant le mettre de mettre un return avt permet de sortir de la boucle plus tôt si l'objet est trouvé. Et en plus sur les exemples de codes rencontrés sur le net c'est souvent l'autre façon

    ce qui donnerait

    2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	public PosteBudgétaire getPoste(String s){
    		PosteBudgétaire posteBudgétaire;
    		Iterator ite = postes.iterator();
    		while(ite.hasNext()){
    			posteBudgétaire = (PosteBudgétaire) ite.next();
    			if( posteBudgétaire.getLabel().compareToIgnoreCase(s)==0 ){
    				return posteBudgétaire;
    			}
    		}
    		return posteBudgétaire;
    	}
    Quelle méthode est donc meilleure syntaxiquement? la 1 ou la 2?

    merci d'avance =)

  2. #2
    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
    Pour ma part, je préfère la première car je n'aime pas non plus mettre plusieurs return dans une fonction.

  3. #3
    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
    Coucou,

    la deuxième sans hésitation.

    Le return te permet d'éviter de continuer l'itération pour rien. Tu as trouvé, tu retournes. C'est comme ci tu cherchais apres quelque chose, que tu le trouvais dans une étagere mais que tu continuais à chercher dans les autres...

    F.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Par contre, ca s'ecrit plutot comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public PosteBudgétaire getPoste(String s){
      Iterator ite = postes.iterator();
      while(ite.hasNext()){
        PosteBudgétaire posteBudgétaire = (PosteBudgétaire) ite.next();
        if( posteBudgétaire.getLabel().compareToIgnoreCase(s)==0 ){
    	return posteBudgétaire;
        }
      }
      return null;
    }
    Mais c'est surtout une histoire de gout.

  5. #5
    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
    Moi aussi je préfère la solution des return, mais il en existe une autre ; plutôt que ta variable trouvé tu peux utiliser un break.

  6. #6
    Membre chevronné
    Profil pro
    Développeur Java Indépendant
    Inscrit en
    Mai 2007
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java Indépendant

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 333
    Points : 2 061
    Points
    2 061
    Par défaut
    Je crois que les breaks sont aussi très déconseillés...

    Je pense que la meilleur façon est de faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public PosteBudgétaire getPoste(String s){
    		PosteBudgétaire posteBudgétaire;
                    PosteBudgétaire posteBudgétaireARetourner = null;
    		Iterator ite = postes.iterator();
                    boolean trouve = false;
    		while(ite.hasNext() && trouve == false){
    			posteBudgétaire = (PosteBudgétaire) ite.next();
    			if( posteBudgétaire.getLabel().compareToIgnoreCase(s)==0 ){
                                    posteBudgétaireARetourner = posteBudgétaire;
                                    trouve = true;
    			}
    		}
    		return posteBudgétaireARetourner ;
    	}
    De cette manière, on ne continue pas à chercher alors qu'on a pas trouvé, et on n'utilise pas plusieurs return....
    Mais dans la pratique, je mettrais plusieurs return, puisque la fonction est petite et donc facilement compréhensible.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Points : 170
    Points
    170
    Par défaut
    Idem je vote pour la seconde et particulièrement pour la solution de Sanguko.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Citation Envoyé par Sanguko Voir le message
    Par contre, ca s'ecrit plutot comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public PosteBudgétaire getPoste(String s){
      Iterator ite = postes.iterator();
      while(ite.hasNext()){
        PosteBudgétaire posteBudgétaire = (PosteBudgétaire) ite.next();
        if( posteBudgétaire.getLabel().compareToIgnoreCase(s)==0 ){
    	return posteBudgétaire;
        }
      }
      return null;
    }
    Mais c'est surtout une histoire de gout.
    Je prendrais cette solution aussi :p même si j'ai toujours cette grosse voix d'un prof d'IUT dans la tête qui me dit : "Une fonction, un return !" méthode monsieur, une méthode

  9. #9
    Membre averti Avatar de Bezout
    Profil pro
    Développement
    Inscrit en
    Septembre 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Développement

    Informations forums :
    Inscription : Septembre 2003
    Messages : 234
    Points : 305
    Points
    305
    Par défaut
    Citation Envoyé par elmor Voir le message
    Idem je vote pour la seconde et particulièrement pour la solution de Sanguko.
    +1
    C'est ce que je fais également.

    Au final c'est vrai que c'est de la syntaxe. L'important est de ne pas tout parcourir si on trouve.

  10. #10
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Ah, je suis content de tomber sur ce poste!
    Voila moi je suis un adepte du return, et j'ai aussi entendu du mal de lui!
    Parcontre on ne ma jamais dit aucun argument!

    Donc j'exprime les miens pour le return :
    • Quand on trouve l'item, on sort directement on sait que rien d'autre ne sera fait pas la suite (parfois loin dans la fonction). On retourne directement l'objet trouvé, qui parfois n'est plus valable en dehors de la boucle.
    • Simplicité de code : rajouter un boolean dans un for ou un while je trouve cela pas très visible, et biensur qui dit rajout de code dit rajout potentiel de bug!
    • Lors de 15 conditions dans une fonction on se retrouve avec un bon nombre d'indentation si on ne fait pas des return à chaque condition.
    • En C le code generé est plus long (rajout d'une condition) ce qui pour des grande recherche peut s'averer un peu plus couteux.

  11. #11
    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
    Solution 2, idem Sanguko, voir encore plus compacte... (mais là c'est du détail)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public PosteBudgétaire getPoste(String s)
    {
      Iterator ite = postes.iterator();
      while(ite.hasNext())
      {
        PosteBudgétaire posteBudgétaire = (PosteBudgétaire)ite.next();
        if( posteBudgétaire.getLabel().compareToIgnoreCase(s) == 0 ) return posteBudgétaire;
      }
      return null;
    }
    Dans tous les cas, il est (à mon avis) toujours préférable de privilégier la lisibilité, et n'en déplaise aux profs, plusieurs points de retour (return) dans une méthode (ou fonction) rendent le code plus aéré...
    En plus, la pluspart des EDI mettent le return en couleur... hyper lisible !

    Il ne faut pas confondre "une fonction, une seule valeur retournée" avec "une fonction, un retour"

    Ce n'est que mon avis...
    A+

  12. #12
    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
    Les profs sont souvent des vieux de la vieille qui ont connu des langages trop peu permissifs et ils enseignent tel qu'ils ont appris.
    Mais l'époque des cartes à trous et des switches binaires est dépassée.
    Les nouveaux langages proposent des mécanismes afin de simplifier la vie des programmeurs alors autant s'en servir.

    Les raisons qui motivent les détracteurs des return multiples et ceux du break sont les mêmes : c'est en général un question de clareté du code parce que ce n'est pas une habitude de programmation (les autres raisons qu'il pouvait y avoir ne sont plus vraies grâce à l'évolution des compilateurs).
    Si c'est bien fait et qu'on en connait le fonctionnement cela peut au contraire rendre le code plus lisible.

  13. #13
    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
    Salut,

    Le break est à éviter autant que possible : il est toujours possible de remplacer un break par une condition d'arret dans la boucle.
    A partir de la, le break, c'est du "sucre syntaxique" venant du C++(je ne sais pas si celà existait avant mais en C++ ça existait) et visant à ne pas dépayser les programmeurs habitués à l'utiliser.

    Comme disait un de mes profs :
    Citation Envoyé par M. Roussel
    Le break, c'est dangereux
    Et je suis plutôt d'accord, même si je suis pour les return qui arrettent les boucles

    F.

  14. #14
    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
    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...

  15. #15
    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
    Ta vision du break et du return est assez contradictoire
    Si tu es pour les return pour sortir d'une boucle, tu n'as aucune raison d'être contre le break. D'autant plus que si pour une raison x tu ne peux pas utiliser de return (par exemple d'autres traitements sont à faire) en sortie de boucle, et si tu ne veux pas utiliser de break, alors on en revient au code 1 du premier post !

  16. #16
    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
    Quelqu'un ici peut me donner un bon argument contre j'utilisation du break ou du return mis à part les "c'est pas bien parce que mon prof me l'a appris" ?

    Le "ça rend le code illisible" non plus ne sera pas accepté puisque si on c'est bien coder ça a l'effet inverse.

  17. #17
    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
    Citation Envoyé par herve91 Voir le message
    Ta vision du break et du return est assez contradictoire
    Si tu es pour les return pour sortir d'une boucle, tu n'as aucune raison d'être contre le break. D'autant plus que si pour une raison x tu ne peux pas utiliser de return (par exemple d'autres traitements sont à faire) en sortie de boucle, et si tu ne veux pas utiliser de break, alors on en revient au code 1 du premier post !
    Tu utilise une condition d'arret supplémentaire dans ta boucle.

    Faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(maCondition1 && maCondition2){
    //...
    }
    //traitement apres la bouche
    ou faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(maCondition1){
    //...
       if(maCondition2)
          break;
    }
    //traitement apres la boucle
    C'est pareil.

    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.

    F.

  18. #18
    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
    il y a un cas où le break rendra le code beaucoup plus lisible :
    - les boucles imbriquées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while (condition1)
    {
       while (condition2)
       {
          // et là, je voudrais sortir de mes 2 boucles : vive le break !
       }
    }
    suite du code...

  19. #19
    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
    Mais en aucun cas il est indispensable.

    Quand je peux l'éviter, je l'évite personnellement.

    F.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    Le fameux cas dont il parlait est le switch/case (d'où le choix du mot cas). Il est en effet difficile de faire sans, dans ce cas là

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