Partage
  • Partager sur Facebook
  • Partager sur Twitter

[c#][wpf][mvvm] Linq et amelioration de code?

Sujet résolu
    10 mai 2019 à 14:23:36

    Bonjour,

    Je viens vers vous pour des questions de pertinence et d'amélioration.

    J'ai des bouts de code, qui je pense peuvent être réduit ou plus "propre".


            public void GetIdMatrice()
            {
                idMatrice = null;
                bool matriceUnique = true;
    
    
                 foreach(var planning in Planning)
                {
    
                    if (matriceUnique)
                    {
                        if (idMatrice == null || planning.IDMatrice == idMatrice)
                        {
                            idMatrice = planning.IDMatrice;
                        }
                        else
                        {
                            matriceUnique = false;
                        }
                    }
                    else
                    {
                        idMatrice = null;
                        _ErrorMatrice = $"Deux matrices différentes trouvées, modification impossible";
                        RaisePropertyChanged(nameof(ErrorMatrice));
                    }
    
                }
            }

    Par exemple à cet endroit. Je parcours une liste de données, et je dois vérifier que dans toute cette liste il n'y a pas deux valeurs différentes, ou plus, pour l'idMatrice.

    Je me demande si une requête Linq peut fonctionner, j'avais pensé à un var x = Planning.where( t => t.idMatrice quelque chose), pour verifier que la valeur de IDMatrice reste toujours la même. Y'a-t-il quelque chose qui peut marcher ?

    J'ai un second bout de code que je trouve plutôt "moche" :

                if (value == "Etablissement")
                {
                    foreach (var periode in PeriodesModulation)
                    {
                        if(periode.IDEtablissement != _dataService.ParamGlobaux.IDEtablissement)
                        {
                            _ResultList.Add($"{periode.IDEtablissement.ToString()} ({periode.Debut.ToShortDateString()} - {periode.Fin.ToShortDateString()})");                       
                        }
                    }
                }

    Je créé une liste, qui plus tard est bind à une combobox. Ca, ca fonctionne.

            public string SelectedResultList
            {
                get
                {
                    return _SelectedResultList;
                }
                set
                {
                    if (value != _SelectedResultList)
                    {
                        _SelectedResultList = value;
                        foreach (var periode in PeriodesModulation)
                        {
    
                            if (value == ($"{periode.IDEtablissement.ToString()} ({periode.Debut.ToShortDateString()} - {periode.Fin.ToShortDateString()})"))
                            {
                                DateDebut = periode.Debut;
                                DateFin = periode.Fin;
                            }
                        }
                        RaisePropertyChanged(nameof(SelectedResultList));
                    }
                }
            }

    Et pour récupérer les dates début / fin correcte, je compare la valeur de ma combobox avec chaque element de la liste pour trouver le bon, et une fois trouvé je définis mes dates. 
    C'est pas super joli, ça fonctionne mais ça peut être mieux, je suppose. 

    Si quelqu'un à des remarques, je suis preneur :)

    Bonne journée


    • Partager sur Facebook
    • Partager sur Twitter
      10 mai 2019 à 15:23:39

      Une méthode "GetIdMatrice" qui renvoie rien, comment dire, c'est quand même bien pourri comme nom, non ?

      C'est pas plutôt un truc comme "bool IsMonoOrEmptyMatrice()" qu'il faudrait implémenter (et éviter de mélanger des choux et des carottes avec ces notification de changement de "Property" complètement WTF ici.

      Et l'implémentation, c'est peanuts :

      bool IsMonoOrEmptyMatrice()
      {
          var id = Planning.FirstOrDefault(x=> { return x.IDMatrice != null});
          return id==null || Planning.All( x => { return x.IDMatrice == null || x.IDMatrice == id});
      }

      >J'ai un second bout de code que je trouve plutôt "moche" :

      Why ?

      LINQ n'y apportera pas grand chose en terme de lisibilité.

      >string SelectedResultList

      Encore un nom, de propriété, choisi avec une grande "Attention", LOL.

      Une string, c'est à la rigueur une liste de caractère, pour le reste, c'est nimportenawak.

      Un passage par un bidouillage à base de chaines de caractères avec un typage "fort" aux abonnés absents, c'est clairement de la tambouille de très bas étage.

      Faites des classes avec des services "carrés".

      Pourquoi votre "ComboBox" n'utilise pas simplement une vraie DataSource ?

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        10 mai 2019 à 16:07:52

        Alors, sachez que je ne veux guère vous manquer de respect, mais je m'adapte toujours au style de mon interlocuteur pour les réponses. Allons y !

        Pour repondre à la majorité de vos "questions" en une fois : 

        "c'est quand même bien pourri comme nom, non ?"
        "
        c'est clairement de la tambouille de très bas étage."
        "Pourquoi votre "ComboBox" n'utilise pas simplement une vraie DataSource ?"

        Vous imaginez bien, que si je n'étais pas débutant, je ne poserais pas les questions que je pose dans ce sujet avec ma "tambouille", non ? 
        Enfin, ça me semblait évident si on lit avec "Attention" LOL, autant que le code que vous avez tapé semble l'être pour vous.

        Ensuite, pour les remarques pertinentes :

        - Pour "bool IsMonoOrEmptyMatrice()", c'est parfait, merci !

        - Pour la "vraie DataSource", je n'y arrivais pas tout simplement :D 
          Quand je travaille avec une seule DataSource et une seule combobox, pas de soucis, mais il se trouve que cette combobox se remplit de trois listes differentes selon le choix de la combobox précédente, et procéder par bind me posait de nouveaux problèmes à chaque fois. Mon temps n'étant pas infini sur ce projet, j'ai pris une solution "plus simple" ou "tambouille" comme vous l’appelez.

        - "Une string c'est nawak" : probablement, c'est pour ça que je cherche à voir ce qui ne se fait pas dans le code, afin de l'améliorer lui, et moi par la même occasion. Encore une fois, désolé de ne pas être un débutant avec 10 ans d'experiences !

        Merci tout de même pour la réponse et avoir pointé, d'une façon certes particulière, ce qui n'allait pas !



        -
        Edité par Jean-Germain 10 mai 2019 à 16:14:26

        • Partager sur Facebook
        • Partager sur Twitter
          10 mai 2019 à 16:23:03

          >si je n'étais pas débutant

          On a tous été débutant et ces questions sont de type socratiques, c'est pour vous vous posiez les bonnes questions sur les connaissances que vous avez déjà acquises, normalement.

          Donc, TOUJOURS faire la démarche de bien nommer les méthodes, cela permet toujours de bien comprendre ce qui doit être implémenter dedans ou pas.

          Partant de là, vous savez déjà pertinemment que votre code est une affreuse tambouille immaintenable, donc à revoir.

          Il y a toujours un moyen relativement élégant de faire les choses.


          >autant que le code que vous avez tapé semble l'être pour vous.

          Qu'est-ce qui n'est pas clair ? Les noms des méthodes n'indiquent-ils pas les traitements qui y sont effectués ? Je ne suis pas infaillible mais il faut quand même prendre la peine de commencer.


          >- Pour la "vraie DataSource", je n'y arrivais pas tout simplement :D

          Vous irez de Charibe en Scylla si vous ne prenez pas la peine de comprendre pourquoi un truc ne fonctionne pas.

          Donc utiliser les DataSources (correctement) et montrez votre code et expliquez "précisément" ce qui ne fonctionne pas.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            10 mai 2019 à 16:44:31

            D'abord, je ne critique pas ce que vous disiez, mais la manière, que je trouvais un peu abrupt. Enfin passons,c'est juste mon point de vue.

            _SelectedResultList pour une combobox qui dans les trois cas retourne une liste contenant les résultats de ma requête et dont je selectionne le résultat courant me semble pertinent, pour être honnête...

            En tout cas je n'ai pas trouvé de meilleur moyen de la reconnaître facilement et de la rendre plus "evidente" quand à son utilité.

            GetIdMatrice permettait à la variable IdMatrice d'obtenir l'ID de la matrice, ça me semblait pertinent, mais c'est vrai que j'aurais pu faire mieux, j'ai repris votre proposition.

            Pour le bool, votre code m'a mis sur la voie pour une autre façon de faire, en utilisant :

            Planning.Distinct().Count() > 1 ? monTraitement : null ;

            Merci pour ça, je pense que ce sera nettement plus clair ainsi que ma premiere version.

            Pour le commentaire concernant le DataSource, je m'attendais à une réponse "si tu n'essaie pas tu ne sauras pas", mais n'est-ce pas cela une reponse socratique ?

            Au risque de me répéter, mon temps n'étant PAS infini, pour terminer ce projet, et j'ai fais le choix de finir le projet qui fonctionne, meme s'il est un peu plus sale sur le code, que quelque chose de parfaitement maitrisé, qui ne serait pas terminé. 

            Je suis dans mes premières mois d'apprentissage, promis dès que je maitriserais les bases, j'attaquerais ce que je trouve trop complexe aujourd'hui. 

            Merci pour vos conseils, quoi qu'il en soit.

            -
            Edité par Jean-Germain 10 mai 2019 à 16:55:01

            • Partager sur Facebook
            • Partager sur Twitter
              10 mai 2019 à 17:00:44

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              [c#][wpf][mvvm] Linq et amelioration de code?

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown