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

Windows Forms Discussion :

[information] meilleures pratiques pour gestion d'events


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 106
    Points
    106
    Par défaut [information] meilleures pratiques pour gestion d'events
    Bonjour,
    Je développe une application winform où plusieurs fenêtres présentent les mêmes objets qui implémentent les interfaces qui vont bien pour le databinding. Pour assurer la synchronisation de mes vues et pour effectuer mes cas d'utilisateur j'ai un assez grand nombre de eventHandler. Je suis pas sûr de la qualité de ma manière de gérer mes eventHandler et voudrait donc avoir des avis.
    Notemment dans une fenetre je crée des cycles d'évenement car j'ai des handler qui réagissent à la vue et d'autre au modèle comme illustré en psuedo-code ci après.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AddHandler CurrentUser.PropertyChanged, Addressof CurrentUser_PropertyChanged
    AddHandler ComboPays.SelectedValueChanged, Addressof ComboPays_SelectedValueChanged
    Je casse les cycles en "débranchant" les eventHandler qui m'embêtent avant un traitement, puis en les rebranchant après. Au besoin j'appelle une metode de raifraichissement de la vue.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sub ComboPays_SelectedValueChanged (...)
    RemoveHandler CurrentUser.PropertyChanged, Addressof CurrentUser_PropertyChanged
    CurrentUser.DoSomeThing(unObjet) 'un traitement
    Update_CurrentVue()
    AddHandler CurrentUser.PropertyChanged, Addressof CurrentUser_PropertyChanged
    end sub
    Cette métode marche bien pour l'instant.
    Du fait que ce n'est pas toujours le même handler qui doit être débrancher/rebrancher,j'ai envie de regrouper tous mes handler pour un objet dans des métodes pour les débrancher/rebrancher. du style
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sub AddHandler_pour_CurrentUser
    sub RemoveHandler_pour_CurrentUser
    Je pourrais ainsi me garantir d'avoir briser tous les cycles et que tout est reinitialiser correctement.
    le nombre de handler par métode n'a rien d'affolant (3-4) mais je me demande si cette métode présente des inconvénients.
    Il y a un cas où il y aurait de nombreux débrancher/rebrancher c'est quand je change l'instance "Parent" de la vue avec une structure hypothétique du style
    MonParent
    |-Une Collection Fille
    |-Une Collection Fille
    |-Un Objet Fils
    |-encore d'autre

    J'aimerai bien avoir des avis, en espérant que ce que j'ai décrit est compréhensible.
    Dom
    PS: je commence à regarder des découplements basés sur le pattern "Command" mais j'aimerai utiliser le moins d'abstraction possible.

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Salut

    Si j'ai bien compris, j'ai deja eu ce probleme. Ton code n'a rien de choquant en soi, mais je pense qu'il pourrait etre beaucoup plus harmonieux si tu ajoutais une propriete "IsUpdating" a chaqun de tes objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub ComboPays_SelectedValueChanged (...)
    CurrentUser.IsUpdating = True
    CurrentUser.DoSomeThing(unObjet) 'un traitement
    Update_CurrentVue()
    CurrentUser.IsUpdating = False
    end sub
    Chaque Set de champ testerai la valeur de Me.IsUpdating et ignorerait le traitemement. De plus, un appel + un test sur un bool devrait etre plus rapide qu'un abonnement/desabonnement a un evenement

  3. #3
    Membre régulier
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 106
    Points
    106
    Par défaut
    Salut,
    Merci de ta réponse
    En analysant un peu mieux mes évennements il était assez simple d'implémenter la solution que tu proposes et je vais donc l'utiliser.
    De plus ca me permet, pour une de mes actions, de continuer à utiliser (ou abuser) les changements sur l'objet, via l'écoute de propertyChanged) au lieu de devoir surveiller tous les champs. :-)

    Bonne journée
    Dom

Discussions similaires

  1. Meilleures pratiques pour un site multi-langues
    Par Bakura dans le forum Référencement
    Réponses: 6
    Dernier message: 22/01/2010, 19h42
  2. Languages de scripts pour Gestion des Events
    Par Raitosan dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 27/08/2009, 11h20
  3. Réponses: 5
    Dernier message: 25/05/2009, 14h59
  4. meilleur pratiques pour des 'patch' en Java
    Par soveste dans le forum Persistance des données
    Réponses: 5
    Dernier message: 02/01/2009, 23h42
  5. Réponses: 7
    Dernier message: 15/02/2008, 20h01

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