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 :

[C#] Comment faut-il déclarer un évenement de changement de valeur ?


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut [C#] Comment faut-il déclarer un évenement de changement de valeur ?
    Bonjour,

    afin de séparer mon interface graphique de mon modèle, j'ai implémenté dans une classe de mon modèle un évenement de changement de valeur.

    Solution1:
    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
     
    public class Data {
     
       private double[] m_Data;     // ensemble de données lue
       private double m_LastData; // mémorise la dernière valeur lue
       public double LastData{
           get { return m_LastData;}
           private set {
                 if (m_LastData != value) {
                           m_LastData = value;
                           LastValueChanged(this,new EventArgs());
                 }
       }
     
       private AcquireData m_Acquire;
     
       public Data() {
            m_Data = new double[1000];
            m_Acquire = new AcquireData();
            m_Acquire.ReadValue += ChangeData;
       }
     
       // Fonction appelé lorsque l'évenement de mise à jour des données
       // est envoyé par l'objet m_Acquire
       public void ChangeData(object sender, eventargs ev) {
     
               Array.Copy(m_Acquire.DataRead, m_Data, value.Length);
     
               // Mise à jour de la dernière valeur
               // L'évenement est automatiquement déclenché
               LastData = m_Data[m_Data.Length-1];                      
       }
     
       pubilc event LastValueChangedEventHandler LastValueChanged;
     
       public delegate void LastValueChangedEventHandler(object sender,
     EventArgs e);
     
    }
    Lorsque la valeur change, l'évenement est appelé dans la propriété LastData.
    La propriété LastData est spécialement crée pour cet évenement.

    Solution 2:
    Ou alors je crée une classe LastDataChangedEventArgs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class LastDataChangedEventArgs {
       private double m_Value;
       public double Value {
          get { return m_Value;}
       }
     
       public LastDataChangedEventArgs (double lastValue) {
           m_Value = lastValue;
       }
    }
    ce qui donnerait dans la méthode ChangeData:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       // Fonction appelé lorsque l'évenement de mise à jour des données
       // est envoyé par l'objet m_Acquire
       public void ChangeData(object sender, eventargs ev) {
     
               Array.Copy(m_Acquire.DataRead, m_Data, value.Length);
     
               // Mise à jour de la dernière valeur
               // L'évenement est automatiquement déclenché
               LastValueChanged(this,new LastDataChangedEventArgs(m_Data
    [m_Data.Length-1]));           
       }
    Selon vous qu'est-ce qui est plus propre ?
    La solution 1 ou la solution 2 ?
    En fait, je me demande si je dois créee un évenement dans lequel je mets en argument la valeur ou si je crée une propriété LastValue qui déclenche l'évenement quand la valeur est réllement modifiée.

    Merci pour vos conseils.

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Salut .

    les deux solutions sont possibles, après il faut savoir si ta propriété de la solution 1 ne va planter ton code si elle est utilisé dans une autre situation que la réponse à l'evènement.
    De plus avec ta solution 1 il faut avoir l'objet dans la classe de gestion de l'évènement ce qui n'est pas toujours le cas.

    En conclusion, je préfère la solution 2 mais les deux fonctionnent.

  3. #3
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Salut,

    Sinon tu peux utiliser le pattern Observer

  4. #4
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Autre question toujours en rapport avec les évenements:
    Supposons que je développe une application en suivant le design pattern mvc.

    Faut-il définir la méthode associé à un evenement en même temps que le contrôle lui-même ou faut-il déclarer cette méthode dans la classe Controller ?

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class View:Form{
           public View() {
            TextBox txtBox=new TextBox();
             txtBox.Validated += controller.ValidateTxtBox;
           }
    }
     
    public class Controller {
     
           public void ValidateTxtBox(object sender, EventArgs e){...}    
    }
    ou faut-il ?

    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
     
    public class View:Form{
           public View() {
            TextBox txtBox=new TextBox();
            Controller controller = new Controller(this)
           }
    }
     
    public class Controller {
          View vue;
     
          public Controller(View vue) {
          this.vue=vue;
          txtBox.Validated += ValidateTxtBox;
    }
           public void ValidateTxtBox(object sender, EventArgs e){...}    
    }
    Et sinon comment architecturez-vous vos applis windows ?

    Merci

  5. #5
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Pour la deuxieme solution, le MVC n'a aucun interet si le controller accede à la vue et la vue accede au Controller, donc je pense que c'est à rejeter.

    Tu peux utiliser la premiere, mais le probleme est que la view dans ce cas est dependante de la technologie du controller, l'interet de MVC est que la vue doit pouvoir etre implementé independament de la technologie du Controller.

    De mon coté, on m'a toujours appris à utiliser le pattern Observer avec MVC, pour que le controller puisse suivre les evenements de la vue.

  6. #6
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Oui en fait pour la deuxième solution,

    je devrais plutôt faire:

    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
    public class Main {
     
        public Main() {
             View vue = new View();
             Controller controller = new Controller(vue);
        }
    }
     
    public class View:Form{
           public View() {
            TextBox txtBox=new TextBox();
           }
    }
     
    public class Controller {
          View vue;
     
          public Controller(View vue) {
          this.vue=vue;
          txtBox.Validated += ValidateTxtBox;
    }
           public void ValidateTxtBox(object sender, EventArgs e){...}    
    }
    Mais je me demande si ça a tellement un interêt de séparer la vue du contrôleur. Le plus important est de bien séparer le modèle mais d'après ce que j'ai vu il est très fréquent que dans une application riche, le contrôleur et la vue ne fasse qu'un.

  7. #7
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Citation Envoyé par Pilloutou
    Mais je me demande si ça a tellement un interêt de séparer la vue du contrôleur. Le plus important est de bien séparer le modèle mais d'après ce que j'ai vu il est très fréquent que dans une application riche, le contrôleur et la vue ne fasse qu'un.
    Suppose que un jour tu, veux refaire la meme application en ASP.Net, et que la vue et le controlleur sont liés. il faudra dans ce cas refaire tout le boulot.

    Voila l'interet de la separation !!

    En fait as-tu refléchit sur ma demande d'utilisation du pattern Observer ? Ou est-ce que la proposition ne t'a pa plu ?

    Je n'ai recu aucun Feedback.

  8. #8
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Suppose que un jour tu, veux refaire la meme application en ASP.Net, et que la vue et le controlleur sont liés. il faudra dans ce cas refaire tout le boulot.
    Ouais carrément juste.
    Faut que je revois ça.

    En fait as-tu refléchit sur ma demande d'utilisation du pattern Observer ? Ou est-ce que la proposition ne t'a pa plu ?
    Si bien sûr, je cherche à l'implémenter. Je suis allé sur le site Web de Microsoft, mais tous leur exemple qui sont au format image sont manquants.
    Je me suis rendu sur le lien que tu m'as proposé. C'est très interessant.
    Mais comment fais-tu dans le cas où certaines modifications n'interessent pas tous les abonnés ? Oui supposons pour reprendre l'exemple du lien que tu m'as donné, que tous les investisseurs d'IBM ne soient pas interessé par la modification du prix ?

    Merci.

  9. #9
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Investor s = new Investor("Sorros");
    Investor b = new Investor("Berkshire");

    // Create IBM stock and attach investors
    IBM ibm = new IBM("IBM", 120.00);
    ibm.Attach(s);
    ibm.Attach(b);
    Bein ici les deux investisseurs Sorros et Berkshire s'abonnent avec ce qui est en gras, donc c'est normal qu'il recoivent les notifications.

  10. #10
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    En fait ce que je voulais dire, c'est que supposons que dans la classe stock, il y ait en plus une propriété quantité, comment préciser que l'investisseur Sorros soit interessé par l'évenement de modification de prix et que l'investisseur soit interessé par l'évenement de modification de quantité ?

    Merci.

  11. #11
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Ah oui t'as raison,
    normalement le pattern notifie les abonnés quand son état change. L'abonnement se fait par rapport à l'objet non pas par rapport à ses état.

    Tu peux comme meme modifier le pattern en y ajoutant plusieurs Arraylist pour chaque membre de la classe Observable, mais je ne trouve pas que c'est une tres bonne idee, surtout si le structure de la classe va changer un un genre alors il faudre reimplementer de nouvelles methodes pour les nouveaux membre.

    Je parlais de Observer, parce que je l'utilisait avec java, ce pattern est si connu qu'il a été implementé dans le SDK (Framework) Java ;Java Developer's Reference Using Observers . Et par suite le MVC sous java est tres facil à utiliser. J'ai fait une petite recherche pour voir de ce qui en est du coté Dot Net et je suis tombé sur ces deux liens:
    Model View Controller (MVC) Using C#, Delegates and Events in .NET
    Exploring the Observer Design Pattern

    Et c'est les delegates qui sont utilisé pour implementer le pattern. En esperant qu'il soit pris en charge directement dans le Framework 3.0 ( mais j'en doute fort )

  12. #12
    Membre éclairé
    Inscrit en
    Juillet 2004
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 306
    Par défaut
    En fait c'est ce qu'il a fait.
    Les evenements en .NET sont des delegates.

    ++

  13. #13
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    Par contre, je viens de tester quelque chose d'assez sympa, le BindingSource. Je n'avais jamais trop essayé, mais c'est vraiment pas mal. Par contre, j'ai quelques p'tits soucis... A voir.

Discussions similaires

  1. [SWT]Quand et comment faut-il "disposer" ?
    Par M4v3rick dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 21/04/2010, 14h10
  2. Faut il déclarer des variables ?
    Par hugo69 dans le forum Langage
    Réponses: 16
    Dernier message: 01/07/2008, 12h08
  3. Réponses: 5
    Dernier message: 21/04/2008, 16h51
  4. Réponses: 2
    Dernier message: 31/10/2007, 12h46
  5. Réponses: 2
    Dernier message: 15/08/2006, 14h47

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