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

  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 : 40
    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

  7. #7
    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 : 40
    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, pour être précis, c'est un problème de logique.

    Si je reprend ce que tu nous dis :

    Donc A != C.

    Et ensuite tu nous écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si val == C alors val == A
    Or sir val == C et val == A, ça veut dire A == C, donc il y a un problème dans ton raisonnement.

    Il en va de même ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    val = soit un objet soit un entier;
    if(!is_object(val)){
        if(!is_numeric(val)) {
            erreur ce n'est pas une valeur numérique
        }
    }
    Tu commences par nous dire val est soit un objet soit un entier. Ton premier test est valide si tu n'es pas sur un objet( tu es donc sur un nombre). Ton second test est vrai si tu n'es pas sur un nombre, ce qui ne peut arriver puisque tu es sur que lorsque tu rentres dans ton bloc tu es sur un nombre.

  8. #8
    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
    Tout à fait je me suis embrouillé en voulant essayer de centrer les explications en fait A et C ici font référence à la condition objet et à l'instance de l'objet donc c'est similaire mais pas exactement pareille et je ne voyais pas trop comment faire pour rester logique.
    C'est pour cela que je demande votre aide.
    val doit etre A ou B si c'est B alors il faut que ce soit different de D si c'est A alors il faut que ce soit C et si c'est C il faut que ce soit différent de D
    Si toutes ces conditions sont remplis on retourne val sinon on retourne une erreur correspondant au problème.

    J'essaie d'expliquer mon problème et de le résoudre en même temps c'est pour cela que j'essaie d'apporter différentes approche à la conception de la structure conditionnelle.

    Tu commences par nous dire val est soit un objet soit un entier. Ton premier test est valide si tu n'es pas sur un objet( tu es donc sur un nombre). Ton second test est vrai si tu n'es pas sur un nombre, ce qui ne peut arriver puisque tu es sur que lorsque tu rentres dans ton bloc tu es sur un nombre.
    Pas forcément, si l'on passe une chaine, ce n'est pas un nombre.

    Merci de vous pencher sur mon problème

  9. #9
    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 : 40
    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
    Et bien dans ce cas le prédicat suivant est faux :

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

  10. #10
    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
    Val est soit un entier soit un objet dans le cas ou tous ce passe correctement, mais l'utilisateur peux passer n'importe quoi. Je m'aperçois que je n'ai pas passer suffisamment d'infos pour que mon problème soit traité facilement. Si il manque encore des infos, je peux les fournirs mais je ne vois pas trop quoi mettre d'autres pour le moment. Désolé du contre temps

  11. #11
    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 : 40
    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
    Et bien dans ce cas, il n'y a pas grand chose à faire. Juste une petite modif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if(!is_object(val)){
        if(!is_numeric(val)) {
            erreur ce n'est pas une valeur numérique
        }
        if(1 == val) {
            erreur val doit être différent de 1
        }
    } elseif (val instanceof ma classe) {
        val = val->num;
    } else {
        erreur ce n'est pas une instance de ma classe
    }

  12. #12
    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
    Malheureusement cela ne résoud pas mon problème d'optimisation et ne prend pas en compte le fait que val->num doit aussi etre != 1

    Mais non je ne suis pas chiant juste pointilleux
    Merci encore de vous prendre la tête avec moi

  13. #13
    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 : 40
    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
    Et bien, si tu dois vérifier le tout, il n'y a semble t'il pas "d'optimisation" possible.

+ 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