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

Algorithmes et structures de données Discussion :

Suite de condition


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut Suite de condition
    Bonjour, je ne suis pas sûr de poster dans le bon forum et je m'en excuse à l'avance si ce n'est pas le cas.

    J'ai en fait un soucis d'optimisation sur une suite de condition dans un if else
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    val = soit un objet soit un entier;
    if(!is_object(val)){
        if(!is_numeric(val)) {
            erreur ce n'est pas une valeur numérique
        }
    } elseif (val instanceof ma classe) {
        val = val->num;
    } else {
        erreur ce n'est pas une instance de ma classe
    }
    if(1 == val) {
        erreur val doit être différent de 1
    }
    retourne un entier val
    Actuellement, j'ai 2 if d'imbriqué et un if à la suite, je ne suis pas satisfait de cette structure et je n'arrive pas à en concevoir une autre qui fasse la même chose mais qui soit optimisée idéalement dans un seul if si possible. Quelques conseils seraient les bienvenues

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Fio,

    Déjà, ça me paraît curieux d'utiliser une même variable pour y mettre soit un entier, soit un objet. Ça te conduit forcément à accumuler les test.
    Une conception différente serait sans doute meilleure.

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    En fait, il y a un soucis de conception.

    Si on s'en tient à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val = soit un objet soit un entier;
    alors ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!is_object(val)){
        if(!is_numeric(val)) {
            erreur ce n'est pas une valeur numérique
        }
    Te conduit à une deuxième structure if qui ne sera jamais vraie.

    Mais pour parler pratique, avoir deux if imbriqués, c'est pas la mort au niveau performance. A mon avis, si tu as des soucis de performances, ça n'est pas là qu'il faut bosser.

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut
    Merci pour vos réponses
    Citation Envoyé par droggo Voir le message
    Fio,

    Déjà, ça me paraît curieux d'utiliser une même variable pour y mettre soit un entier, soit un objet. Ça te conduit forcément à accumuler les test.
    Une conception différente serait sans doute meilleure.
    Une valeur ne doit contenir qu'un seul type de variable en effet mais pour des raisons d'utilisation de ma fonction le paramètre passé doit pouvoir accepter les 2. L'accumulation des tests ne me dérange pas mais je souhaiterais les effectuer de la manière la plus optimisé qu'il soit.
    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
    function test(val){
    if(!is_object(val)){
        if(!is_numeric(val)) {
            erreur ce n'est pas une valeur numérique
        }
    } elseif (val instanceof ma classe) {
        val = val->num;
    } else {
        erreur ce n'est pas une instance de ma classe
    }
    if(1 == val) {
        erreur val doit être différent de 1
    }
    retourne un entier val
    }
    Citation Envoyé par PRomu@ld Voir le message
    En fait, il y a un soucis de conception.

    Si on s'en tient à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val = soit un objet soit un entier;
    alors ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!is_object(val)){
        if(!is_numeric(val)) {
            erreur ce n'est pas une valeur numérique
        }
    Te conduit à une deuxième structure if qui ne sera jamais vraie.
    Euh ben la j'avouerais que j'ai pas tout saisi.
    Mais pour parler pratique, avoir deux if imbriqués, c'est pas la mort au niveau performance. A mon avis, si tu as des soucis de performances, ça n'est pas là qu'il faut bosser.
    Ce n'est pas un soucis de perf mais bien d'optimisation de code que je cherche à avoir. J'ai l'impression que ce code est très sale et qu'un petit nettoyage ne serait pas superflu

    Pour expliquer plus clairement, ma fonction prend un paramètre qui sera soit un objet soit un entier.
    Si c'est un entier et que sa valeur est différente de 1 elle retourne directement l'entier.
    Si c'est un objet et que cet objet est bien une instance de maclasse alors elle va rechercher l'entier de l'objet si cet entier est différent de 1 elle retourne l'entier
    Si ce n'est pas une instance de ma classe on renvois une erreur précisant que ce n'est pas une instance de ma classe
    Si ce n'est pas une valeur numerique on renvois l'erreur ce n'est pas une valeur numérique
    Si l'entier vaut 1 on renvoit une erreur precisant que l'entier ne doit pas valoir 1. Ma fonction fait ce que je lui demande mais pas de manière optimisé et c'est ce qui me gène un peu. Si vous avez des conseils je suis preneur

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Fio,

    Je ne vois toujours pas pourquoi tu as vraiment besoin de faire ainsi.

    Pour moi, il y a tout simplement erreur de conception, et si tu veux "optimiser ton code", comme tu dis (et qui ne veut pas dire grand chose), il faut commencer par revoir la conception.

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut
    Tu ne dois pas connaître le proverbe qui dit on ne discute pas un ordre même quand celui-ci est débile

    Il est fort possible que ce soit une erreur de conception mais la question n'est pas là. La question est d'optimiser (je ne vois pas en quoi cela ne veux rien dire) le code, le terme refactoring aurait peut être été plus adéquat mais bon...

    Donc, la question n'est pas de savoir si le code est mal conçu pour le reste de l'appli (ce n'est pas moi qui l'ai commencé, j'ai repris la suite) mais juste comment arranger ou refactoriser la structure conditionnelle. Le fait que dans les conditions, il y ai un test sur le type de la variable ne doit pas être un obstacle à l'optimisation de ces tests.

    Les tests dans les différents if sont importants pour les méthodes qui sont implémentées mais niveau algo je ne vois vraiment pas l'importance que cela puisse avoir. Si cela te gène, on pourrait revoir la structure du if comme cela
    Prenons 4 conditions A B C et D et une valeur val
    Dans ma structure, cela devrait donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if(A != val){
        if(B != val){
            erreur B
        }
    } elseif (C == val){
        retour val
    } else {
        erreur C
    }
    if(D != val){
        erreur D
    } else {
       retour val
    }
    Si val est different de A et B on renvoit une erreur B
    Si val == C on retourne val sinon on renvoit une erreur C
    Si val == C alors val == A
    Si val == A et val != C on renvoit une erreur C
    Si val == B alors val != D
    Si val == B et val == D on renvoit une erreur D
    Sachant aussi que A != B != C != D

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

Discussions similaires

  1. Perte données nulle suite ajout condition Where
    Par Punpunj dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2014, 10h37
  2. [XL-2007] message suite deux conditions
    Par khalidabc dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/08/2013, 10h47
  3. Factoriser une suite de conditions
    Par Lexarino dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2008, 18h35
  4. Réponses: 10
    Dernier message: 31/08/2006, 14h57
  5. [DOS] suite d'instructions en dos dans une condition if
    Par hbendali dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 06/03/2006, 16h45

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