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 :

Factoriser un code en une seule méthode


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Par défaut Factoriser un code en une seule méthode
    Bonjour j'aimerais savoir comment faire pour factoriser ce bout de code si c'est possible.
    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
                foreach (FileInfo fichier in listeFicATraiter)
                {
     
                    if (CBbl.Checked == true)
                    {
                        searchP = "BL";
                        Filist.AddRange(Methode.GetList(fichier, searchP));
                    }
     
                    if (CBpod.Checked == true)
                    {
                        searchP = "POD";
                        Filist.AddRange(Methode.GetList(fichier, searchP));
     
                    }
     
                    if (CBfac.Checked == true)
                    {
                        searchP = "FAC";
                        Filist.AddRange(Methode.GetList(fichier, searchP));
     
                    }
     
                    if (CBpd.Checked == true)
                    {
                        searchP = "PD";
                        Filist.AddRange(Methode.GetList(fichier, searchP));
     
                    }
     
                    if (CBlit.Checked == true)
                    {
                        searchP = "LIT";
                        Filist.AddRange(Methode.GetList(fichier, searchP));
     
                    }
     
                    if (CBTousT.Checked == true)
                    {
                        searchP = "*";
                        Filist = listeFicATraiter;
     
                    }

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    Tu pourrais affecter un Tag à chacune de tes case à cocher.
    Et dans ce cas (code codé rapidement dans le forum et non testé):
    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
    foreach( var control in ParentDesChecheckBox.Controls)
    {
        if ((control is CheckBox) && ((CheckBox)control).Checked)
        {
            String search = (String)((CheckBox)control).Tag;
            if (search == "*")
            {
                Filist = listeFicATraiter;
                break;
            }
            else
            {
                Filist.AddRange(Methode.GetList(fichier, search));
            }
        }
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2018
    Messages : 4
    Par défaut
    Merci pour ta réponse, j'ai essayé de mon coté et j'ai fait ça, c'est plus long par contre.
    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
    public void CheckBoxType(object sender, EventArgs e)
            {
                CheckBox cboxt = (CheckBox)sender;
     
                if (cboxt.Checked == true && !type.Contains(cboxt.Text.ToUpper()))
                {
                    type.Add(cboxt.Text.ToUpper());
     
                }
                else if (cboxt.Checked == false && type.Contains(cboxt.Text.ToUpper()))
                {
                    type.Remove(cboxt.Text.ToUpper());
                }
                else if (CBTousT.Checked == true)
                {
                    type.Clear();
     
                }
    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
                // Récupère la liste des fichiers correspondant aux types.
                if (CBTousT.Checked == true)
                {
                    LTypeFile = LAllFile;
     
                }
                else
                {
                    foreach (string i in type)
                    {
                        progressBar.PerformStep();
                        Console.WriteLine(i);
                        LTypeFile.AddRange(LAllFile.Where(a => a.Name.ToUpper().StartsWith(i)));
                    }
                }

  4. #4
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par popo Voir le message
    Tu pourrais affecter un Tag à chacune de tes case à cocher.
    Et dans ce cas (code codé rapidement dans le forum et non testé):
    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
    foreach( var control in ParentDesChecheckBox.Controls)
    {
        if ((control is CheckBox) && ((CheckBox)control).Checked)
        {
            String search = (String)((CheckBox)control).Tag;
            if (search == "*")
            {
                Filist = listeFicATraiter;
                break;
            }
            else
            {
                Filist.AddRange(Methode.GetList(fichier, search));
            }
        }
    }
    Je plussois pour l utilisation de la propriété tag et ta logique d optimisation. 😉

  5. #5
    Membre expérimenté
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Par défaut
    Bonjour,

    Je plussois pour l utilisation de la propriété tag et ta logique d optimisation.
    Pas moi, mais bon, je ne met pas de pouce rouge car ça reste valable .
    Le truc, c'est que je n'aime pas l'utilisation du Tag, donc je te propose une autre solution.

    Déjà, plutôt que d'utiliser des littéraux, utilise un enum, ça te simplifiera la vie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public enum Search
        {
            BL,
            POD,
            FAC,
            PD
        }
    Ensuite, c'est de créer un dictionnaire qui met en relation tes enums et tes CheckBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Dictionary<Search, CheckBox> dicoDeCb = new Dictionary<Search, CheckBox>();
    Puis, d'une manière simple(*), dans le constructeur de ta fenêtre, de remplir ton dictionnaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                dicoDeCb.Add(Search.BL, cbBl);
                dicoDeCb.Add(Search.POD, cbPod);
                dicoDeCb.Add(Search.FAC, cbFac);
                dicoDeCb.Add(Search.PD, cbPd);
    Et au final, au moment où tu en besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            private void button1_Click(object sender, System.EventArgs e)
            {
                foreach (KeyValuePair<Search, CheckBox> entry in dicoDeCb)
                {
                    if (entry.Value.Checked)
                    {
                        MessageBox.Show(entry.Key.ToString());
                    }
                }
            }
    Il ne te reste plus qu'à mettre ton traitement à la place du MessageBox.
    Le dernier truc, c'est le CheckBox 'Tous', soit tu commence par le regarder et si il est checked, tu t’abstiens de faire le foreach, soit tu le gère différemment, personnellement, je préférerais un petit bouton (Tous/Aucun) qui coche ou décoche tous les CheckBox, ça t'évite d'avoir une manière de faire différente pour lui.

    (*) La méthode un peu plus compliquée serait de créer dynamiquement tes CheckBox en fonction de ton enum et de remplir le dico en même temps mais bon, c'est un autre problème.

    Bonne continuation.

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Pour ma part, partant du principe qu'un CheckBox et coché et un seul, je verrai un truc comme cela.

    Mais j'ai des interrogations sur la boucle foreach, a quoi sert-elle ?
    et que fait et retourne Methode.GetList ?

    Je laisse comme ceci pour un soucis de lisibilité mais nous pouvons factoriser beaucoup plus si c'est le jeu.

    PS : J'ai conscience que mon Filist.AddRange(Methode.GetList... n'est pas identique à celui dans ta boucle (1 fois vs plusieurs fois).

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
                var arr = new [] {
                    new { CB = CBbl, searchP = "BL" },
                    new { CB = CBpod, searchP = "POD" },
                    new { CB = CBfac, searchP = "FAC" },
                    new { CB = CBpd, searchP = "PD" },
                    new { CB = CBlit, searchP = "LIT" },
                    new { CB = CBTousT, searchP = "*" },
                };
     
                string searchSelect = arr.First(a => a.CB.Checked).searchP;
     
                if (searchSelect == "*")
                    Filist = listeFicATraiter;
                else
                    Filist.AddRange(Methode.GetList(fichier, searchSelect));

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    Citation Envoyé par Kyroon Voir le message
    Bonjour,
    Pas moi, mais bon, je ne met pas de pouce rouge car ça reste valable .
    Le truc, c'est que je n'aime pas l'utilisation du Tag, donc je te propose une autre solution.
    Citation Envoyé par Kyroon Voir le message
    Ensuite, c'est de créer un dictionnaire qui met en relation tes enums et tes CheckBox :
    La propriété Tag sert justement à éviter ce genre d'artifices.
    Imagine qu'en plus des cases à cocher, tu dois lier des données à des combo, et également à des grilles ou des noeuds de treeview.
    Tu vas multiplier les dictionnaires...

  8. #8
    Membre expérimenté
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Par défaut
    Bonjour,

    Mon problème avec le Tag, c'est que depuis quelques années, je doit maintenir une application où les Tags à été utiliser pour stocker des infos diverses et variées. Le problème, c'est que c'était tellement pratique, que tout ou presque se trouve derrière le Tag, le Tag contient une adresse mémoire qui pointe vers un objet perso (ou une structure, ça dépend des cas), qui lui contient un tas d'infos. A maintenir, c'est un calvaire à chaque fois (c'est pas du C# par contre).
    Tu va me dire qu'a petite dose, occasionnellement, le Tag peu être utile, je suis d'accord la dessus. C'est certainement ce que pensait les personnes qui ont développé l'appli que je doit maintenir, au début, et je vois ce qu'il en est aujourd'hui. Pour moi, c'est le Tag qui est un artifice.


    La différence entre les CheckBox et les autres contrôles que tu site, c'est que les CheckBox ne gère pas les listes, alors que les autres oui, la différence est notable.
    Maintenant, suivant ce que je comprend du contexte, il s'agit de faire un filtre avec multi sélection. Personnellement, si j'avais eu à traiter un cas comme celui-ci, j'aurais certainement créer un contrôle utilisateur qui permet de gérer des listes de CheckBox et je l'alimenterais avec une liste d'objets (liste d'objets que tu peux également utiliser pour alimenter un combo, grille et autres) et qui me retournerais la liste des objets qui ont été cochés, enfin ça reste de la théorie réfléchit en 5mn sans connaitre le contexte réelle.

    Bonne continuation.

Discussions similaires

  1. code repeter--->une seul code, valeur sur colonne
    Par Jacobian dans le forum Excel
    Réponses: 6
    Dernier message: 09/04/2008, 19h16
  2. un bloc de code executé une seule fois ?
    Par root76 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/08/2006, 18h24
  3. [AS1-2] Lancer un code AS une seul fois...
    Par rteuteu55 dans le forum Flash
    Réponses: 6
    Dernier message: 13/04/2006, 14h05
  4. Réponses: 1
    Dernier message: 19/03/2005, 22h47
  5. [C#] Une seule méthode pour plusieurs composants
    Par niPrM dans le forum Windows Forms
    Réponses: 8
    Dernier message: 01/06/2004, 14h41

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