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

C# Discussion :

amélioration de code à base de if imbriqués


Sujet :

C#

  1. #1
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut amélioration de code à base de if imbriqués
    Dans une fonction, pour des besoins métiers et fonctionnels, j'ai la structure suivante

    Attention ! Ça pique les yeux !!!


    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    if(A!= null && A.truc == true)
    {
     ....if (B!= null && B.truc == true)
     ....{
     ........if (C!= null && C.truc == true)
     ........{
    .............if (D == null ||!(D.machin == E.biduleA || D.machin == E.biduleB || D.machin == E.biduleC)) return false;
    ........}
    ........else
    ........{
    .............if (D == null ||!(D.machin == E.biduleA || D.machin == E.biduleB )) return false;
    ........}
    ....}
    ....else 
    ....{ 
    ........if (C!= null && C.truc == true)
    ........{
    .............if (D == null ||!(D.machin == E.biduleA || D.machin == E.biduleC)) return false;
    .........}
    .........else
    .........{
    .............if (D == null || D.machin != E.biduleA) return false;
    .........}
    .....}
    }
    else 
    {
    ....if (B!= null && B.truc == true)
    ....{
    .........if (C!= null && C.truc == true)
    .........{
    ..............if (D == null ||!(D.machin == E.biduleB || D.machin == E.biduleC)) return false;
    ..........}
    .........else
    ........{
    .............if (D == null ||  D.machin != E.biduleB) return false;
    .........}
    ....}
    ....else
    ....{
    .........if D== null || D.machin != E.biduleC) return false;
    ....}
    }
    quelqu'un a-t-il une idée pour optimiser ce code ?

    C'est du Winform classique, 100% "Client lourd"
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    tu peux essayer de voir si des cas sont fusionables avec une table de vérité, mais le code résultant ne sera peut-être pas plus lisible (voire pire).
    Et puis le code que tu nous montres n'est pas bien méchant niveau perf'.
    Sinon, comme on comprend rien aux conditions, je me demande si y'a pas des cas sans retour
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Sinon, une autre piste est d'isoler les "sous ifs" dans des methodes, par exemple :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(A!= null && A.truc == true)
    {
    	CaseATrue(B, C, D);
    }
    else 
    {
    	CaseAFalse(B, C, D);
    }
    Ensuite dans CaseATrue et CaseAFalse tu reportes les conditions, etc. Ca va te donner un genre d'arbre de decision, qui sera plus facile a tester.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    tu peux essayer de voir si des cas sont fusionables avec une table de vérité, mais le code résultant ne sera peut-être pas plus lisible (voire pire).
    J'ai déjà fusionné des cas pour améliorer le code fait par mon prédécesseur (surement en utilisant la métode Larache)

    Citation Envoyé par jopopmk Voir le message
    Sinon, comme on comprend rien aux conditions
    En effet, j'ai fait une erreur monumentale en transcrivant mon code, c'est maintenant corrigé

    Avec des mots ca donne :

    Si A.truc, B.truc, et/ou C.truc est vrai alors on doit vérifier que D n'est pas null et que nous avons une égalité entre D.machin et l'attribut bidule de E correspondant respectivement à A, B et/ou C

    Pas de cas sans retour, je n'ai pas mis tout le code de la fonction, juste le bloc qui me pose problème

    Citation Envoyé par DotNetMatt Voir le message
    Sinon, une autre piste est d'isoler les "sous ifs" dans des methodes ... tu reportes les conditions, etc.
    C'est que ça sera un peu plus lisible comme ça, merci du conseil
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    j'irais sur un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (D == null) {return false;}
    var possibleValues = new List<toi même tu sais>();
     
    if (A != null && A.truc) {possibleValues.Add(E.BiduleA);}
    if (B != null && B.truc) {possibleValues.Add(E.BiduleB);}
    if (C != null && C.truc) {possibleValues.Add(E.BiduleC);}
     
    return possibleValues.Contains(D.machin);

    A B et C sont du même type ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    HS : dans un bloc CODE les espaces sont conservées, tu n'es pas obligé de mettre des points pour l'alignement
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    HS : dans un bloc CODE les espaces sont conservées, tu n'es pas obligé de mettre des points pour l'alignement
    Pour des raisons de confidentialité, j'ai dû "masqué" les noms des classes et des attributs. Du coup, j'ai perdu l'indentation de Visual Studio

    Citation Envoyé par Pol63 Voir le message
    A B et C sont du même type ?
    A, B et C sont trois classes différentes, mais avec une partie de leurs attributs identiques car elles héritent toutes les trois de la même classe.

    Merci de ta proposition pour simplifier ce morceau de code, je vais m'en inspirer
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

Discussions similaires

  1. Optimisations et Améliorations de code
    Par womannosky dans le forum Langage
    Réponses: 19
    Dernier message: 02/07/2008, 15h05
  2. [Optimisation]Peut-on améliorer ce code ?
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 09/08/2007, 15h43
  3. Réponses: 1
    Dernier message: 15/03/2007, 17h43
  4. [Tableaux] Amélioration de code (if)
    Par Sir Tengu dans le forum Langage
    Réponses: 3
    Dernier message: 24/12/2006, 00h26
  5. [Sécurité] Comment amélioré mon code ?
    Par Nadd dans le forum Langage
    Réponses: 14
    Dernier message: 03/03/2006, 20h13

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