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 :

Comment remplacer un IF trop long ?


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 193
    Par défaut Comment remplacer un IF trop long ?
    Bonjour à tous,


    Voilà, je travaille sur une application qui a été développée par un ancien programmeur. Cette application a été développée avec Jdev 10g sous XP.

    Donc, je veux changer un IF d'une forme trop longue comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If (type = 1 ou type = 2 ou type = 3  ou type = 4 ou type = 5
         ou type = 6 ou type = 7 ou type = 8 ou type = 9 ou type = 10
         ou type = 11 ou type = 11 ou type = 12 ou type = 13 ou type = 14
         ou type = 15 ou type = 16 ou type = 17 ou type = 18 ou type = 19 ...){
     
     ...
    }
    Comment puis je remplacer ce IF par un autre plus conviviable ?


    Merci d'avance de votre aide

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Ben tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( 0 < type && type < 20 ) {
     
    }

    a++

  3. #3
    Membre extrêmement actif
    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
    Par défaut
    Bonjour,
    Je sais pas si "type" dans son exemple est un int ou si c'est juste pour l'exemple. ^^'

    Dans le doute, j'aurais mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    List<Type> listType = getListType();
    if(listType.contains(type){
    ...
    }
    Edit : Grillé comme un poulet

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    772
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 772
    Par défaut
    Moi je dis méfiance, il faudrait être un peu naïf pour coder comme ça,
    peut-être qu'il n'a pas le choix.
    Faut voir le contexte moi je dis.

  5. #5
    Membre extrêmement actif
    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
    Par défaut
    Je vois pas de cas où ma liste marche pas.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Par défaut
    un switch case peut-être ?
    Mais comme l'a dit GanYoshi, ça dépend du type...

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Dans ce cas, il est plus sécurisé de faire une méthode monTestSurUnEntier, qui va elle même utiliser la liste, en private static final ; comme ça on évite des modification intempestives sur cette liste dans le code (ce qui n'est pas censé arriver au vu du code).

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    heu , non, dans ce cas, on met le code d'adiguba et c'est bon. Si les contraintes changent demain, à charge du développeur de demain de faire le changement qui est nécessaire.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    772
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 772
    Par défaut
    Citation Envoyé par GanYoshi Voir le message
    Je vois pas de cas où ma liste marche pas.
    Si ca marche, mais des fois il suffit de tester l'inverse qui est en fait très court et de faire un not dessus pour le même effet.
    Enfin faut voir le vrai code.

  10. #10
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 193
    Par défaut
    oups

    Je m'excuse, j'ai donné un mauvais exemple, j'ai simplifié.

    Au fait, mon IF est de la forme suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If (type = val1 ou type = val2 ou type = val3  ou type = val4 ou type = val5
         ou type = val6 ou type = val7 ou type = val8 ou type = val9 ou 
         type = val10 ou type = val11 ou type = val11 ou type = val12 ou 
         type = val13 ou type = val14 ou type = val15 ou type = val16 ou 
         type = val17 ou type = val18 ou type = val19 ...){
     ...
    }
    Des valeurs qui ne se suivent pas forcement.

    La variable type est un int.

    merci

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par krilas Voir le message
    Je m'excuse, j'ai donné un mauvais exemple, j'ai simplifié.
    Et apparemment c'est toujours le cas (le code donnée n'est toujours pas du Java).

    Pourquoi ne pas donner le code exact ??? Ce serait tellement plus simple

    Sinon à quoi correspond val1, val2, ... ?
    C'est des constantes ? Des variables ?

    S'il s'agit de constante on peut envisager un switch, sinon le plus simple étant de passer par un tableau...


    a++

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    S'il s'agit de constante on peut envisager un switch, sinon le plus simple étant de passer par un tableau...
    je préfère le SET si il y a beaucoup de valeurs possibles :p

  13. #13
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 193
    Par défaut
    voila le code initial ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (typeOp == 60 || typeOp == 61|| typeOp == 160 || typeOp == 161 || 
    	typeOp == 10 || typeOp == 11 || typeOp == 12 || typeOp == 110 || 
    	typeOp == 111 || typeOp == 112 || typeOp == 30 || typeOp == 31 || 
    	typeOp == 32 || typeOp == 130 || typeOp == 131 || typeOp == 132|| 
    	typeOp == 20 || typeOp == 120 || typeOp == 230 || typeOp == 231 || typeOp == 232) {
     
    	}

  14. #14
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    il était payé à la ligne de code l'ancien programmeur?

    je vois deux codes "propre" possibles pour ce genre de test "compliqué"

    1) facile à mettre en oeuvre, pourrais devenir chiant si demain tu dois ajouter "|| typeOp%59 ==38"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (TypeOpCriteresMachinSet.contains(typeOp)){
     ......
    }
    2) reporte le problème dans la méthode, plus facile à faire évoluer, surtout si ce critère est utilisé identiquement à plusieurs endroits du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (isTypeOpCriteresMachin(typeOp)){
     ......
    }

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Par défaut
    je sais pas mais il avais du courage

    un truc comme ceci te convient il?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        private static int[] listType = {60, 61, 160, 161, 10, 11, 12, 110, 111};
     
        private static boolean testif(int type) {
            boolean result = false;
            for (int i = 0; i < listType.length; i++) {
                result |= listType[i] == type;
            }
            return result;
        }

    OutPut
    pour la valeur 99 : false
    pour la valeur 160 : true

  16. #16
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        private static Set<Integer> listType = new HashSet(Arrays.asList(new int[]{60, 61, 160, 161, 10, 11, 12, 110, 111}));
     
        private static boolean testif(int type) {
            return listType.contains(type); // plus performant ;)
        }

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Par défaut
    a bien oui aussi je suis con moi lol il y a déjà une fonction qui le fait

    en plus avec le set tu aura pas de doublon dans le test

  18. #18
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Donc un switch peut très bien faire l'affaire, mais ce n'est pas forcément plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    switch (typeOp) {
    case 60: case 61: case 160: case 161:
    case 10: case 11: case 12: case 110: 
    case 111: case 112: case 30: case 31:
    case 32: case 130: case 131: case 132:
    case 20: case 120: case 230: case 231: case 232:
        // ... 
        break;
    }

    Une solution plus lisible serait de passer par un tableau implicite via les varargs, via une méthode comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public static boolean inList(int search, int...values) {
            for (int value : values)
                if (search==value)
                    return true;
            return false;
        }
    Qui s'utilise comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (inList(typeOp, 60, 61, 160, 161, 10, 11, 12, 110, 111, 112, 
                30, 31, 32, 130, 131, 132, 20, 120, 230, 231, 232)) {
    		// ...
        }
    On peut également passer par une List ou un Set mais cela engendrera une conversion implicite en Integer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        if (Arrays.asList(60, 61, 160, 161, 10, 11, 12, 110, 111, 112, 
                30, 31, 32, 130, 131, 132, 20, 120, 230, 231, 232).contains(typeOp)) {
            // ...
        }
     
        if (new HashSet<Integer>(Arrays.asList(60, 61, 160, 161, 10, 11, 12, 110, 111, 112, 
                30, 31, 32, 130, 131, 132, 20, 120, 230, 231, 232)).contains(typeOp)) {
            // ...
        }
    Cela peut être avantageux si on conserve le Set en mémoire... mais pas forcément si on doit le créer uniquement pour cela.


    a++

    [edit] Un peu grillé

  19. #19
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 193
    Par défaut
    je vais choisir la liste ou le set car la liste est amenée à evoluer , non ?

    Merci beaucoup de votre aide

    à +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment raboter un texte trop long et ajouter 3 petits points ?
    Par djibril dans le forum Téléchargez
    Réponses: 3
    Dernier message: 06/05/2014, 17h33
  2. Comment couper les mots trop longs
    Par marcello2 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 09/06/2009, 09h00
  3. Comment supprimer répertoire trop long ?
    Par Tueur_a_gage dans le forum Windows XP
    Réponses: 3
    Dernier message: 27/06/2006, 12h29
  4. [Conversion]Comment faire pour couper un Double trop long?
    Par dessinateurttuyen dans le forum Général Java
    Réponses: 1
    Dernier message: 13/11/2005, 03h22
  5. Comment remplacer trop de "if" ?
    Par Clad3 dans le forum C++
    Réponses: 14
    Dernier message: 28/03/2005, 21h08

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