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#] Je suis accroc aux évenements. Comment m'en passer ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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#] Je suis accroc aux évenements. Comment m'en passer ?
    Bonjour,

    je travaille sur une application qui manipule des code barres.
    Mon problème est que cette application utilise selon moi un peu trop les évènements.
    L'architecture est la suivante.
    J'ai développé une classe qui possède une instance de la classe serialport.
    Cette classe est chargé de récupérer le code-barre lue (1er evenement pour la lecture du code-barre) et de le mettre en forme de manière à avoir un string. Une fois mis en forme, un évenement avec en paramètre le code-barre mis en forme est lancé. (Deuxième évenement)
    Cet évenement est récupéré par une classe qui va interroger la base de données à partir du code-barre lue pour récupérer le produit associé. Un nouvel évenement (le troisième) est lancé avec en paramètre, le code-barre et le produit associé.
    Une autre classe récupère cet évenement pour un traitement (ajout dans une liste de produits) et lance à son tour un évenement (le quatrieme) pour que l'interface graphique puisse être avertie que la liste a été mise à jour et puisse afficher les caractéristiques du dernier produit scanné.

    Ce qui me fait 4 evenements, et je serais même tenté d'en rajouter pour d'autre traitement. Il faut que je m'arrête, je me rends compte que je suis un fana des évenements. Je ne sais pas si c'est ainsi qu'il faut faire.
    Comment vous y prendriez-vous ?

    N'y a-t-il pas un moyen différent de faire la même chose ?

    Merci.

  2. #2
    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
    Ca s'appelle bien la programmation événementielle. Si tu savais combien windows genere d'evenements juste en bougeant la souris ou juste en faisant rien tu ne serais pas trop decu de tes 4 evenements.

  3. #3
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Pilloutou
    .
    Ce qui me fait 4 evenements, et je serais même tenté d'en rajouter pour d'autre traitement. Il faut que je m'arrête, je me rends compte que je suis un fana des évenements. Je ne sais pas si c'est ainsi qu'il faut faire.
    Comment vous y prendriez-vous ?
    N'y a-t-il pas un moyen différent de faire la même chose ?
    Merci.
    Il faut faire une programmation multi processus.
    Prendre la classe Thread et créer des objets Thread avec au besoin des AutoResetEvent
    using System;
    using System.Threading;

    class Test
    {
    static void Main()
    {
    Thread newThread =
    new Thread(new ThreadStart(Work.DoWork));
    newThread.Start();
    }
    }

    class Work
    {
    Work() {}

    public static void DoWork() {}
    }
    Sinon tu ne seras pas synchro dans les événements...



    Citation Envoyé par mehdi_tn
    Ca s'appelle bien la programmation événementielle. Si tu savais combien windows genere d'evenements juste en bougeant la souris ou juste en faisant rien tu ne serais pas trop decu de tes 4 evenements.
    Oui et le problème c'est que des langages qui font abstraction des couches les plus basses masquent totalement ces méchanismes

  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
    Citation Envoyé par Mose
    La réponse est N-tiers
    Ah ? C'est ce que j'avais cherché à mettre en place
    En fait, j'avais trouvé dans les évenements une solution qui me permettait de répercuter l'évenement de départ initié par le lecteur aux classes des couches supérieures.

    Citation Envoyé par Mose
    premier évènement : oui. viens de l'extérieur, cohérent, c'est de l'interfacage (donc évènementiel)
    Oui effectivement, c'est l'évenement envoyé par le lecteur lorsqu'une donnée est présente et réceptionné par la classe LecteurCodeBarre.

    Cette classe gère l'ouverture et la fermeture du port série, et surtout récupére les octets de la mémoire tampon et les met sous forme d'un string.

    Citation Envoyé par Mose
    non. c'est juste une classe qui bosse ?
    Cette classe est la classe LecteurCodeBarre décrite précédemment.
    Je cherchais à faire une telle classe et la rendre réutilisable.

    Citation Envoyé par Mose
    t'as ptet un pti problème d'architecture
    Oui, oui c'est que je me demande aussi.

    Mais alors comment faire exactement ?

    Comme j'expliquais, la classe DetermineCodeBarre est abonné à l'évenement lancé par la classe LecteurCodeBarre.
    La classe DetermineCodeBarre comme son nom l'indique, détermine si le code barre lue est celui d'un produit, d'un OF ou autre chose.
    Selon, le type associé au code-barre, cette classe effectue le traitement adéquat. Récupérer le produit ou l'OF dans la base de données à l'aide des classes ProduitDAO et OFDAO.

    Citation Envoyé par Mose
    soit tu la fusionnes avec l'autre
    Donc tu me conseilles de ne faire qu'une classe entre la classe LecteurCodeBarre et DetermineCodeBarre ?
    Dans ce cas, ma classe LecteurCodeBarre ne sert plus et n'est plus réutilisable, non ? Qu'en pensez-vous ?
    Et pourtant, tu dois être d'accord(enfin je pense) que le code que j'utilise dans la méthode de la classe LecteurCodeBarre qui met tous les octets reçues sous forme d'une chaîne de caractère doit être réutilisable.

    Citation Envoyé par Mose
    troisième évènement : non. ta classe (code métier) a normallement accès à ta classe d'accès aux données. C'est un appel, pas un évènement.
    Cette classe est la classe MaClasseMetier qui va ensuite gérer tout mon process.

    MaClasseMetier notifie l'interface utilisateur qu'un changement a eu lieu par un évenement. J'avais lu que c'était une soi-disant bonne solution.

    Pour résumer, j'ai les classes suivantes:
    LecteurCodeBarre
    DetermineCodeBarre
    ProduitDAO
    OFDAO
    MaClasseMetier
    MonInterface


    Donc globalement, tu me conseilles de faire la chose suivante :
    - de ne plus utiliser la classe LecteurCodeBarre.
    C'est dommage, je l'aimais bien cette classe.
    Mais comment je gère l'ouverture et la fermeture ?

    - que DetermineCodeBarre récupère le code-barre et le mette sous forme d'une chaîne de caractères en appelant une méthode static.
    Mais je ne trouve pas ça réutilisable, qu'en penses-tu ?

    - que MaClasseMetier accède à ma classe DetermineCodeBarre pour récupérer le produit ou l'OF mais comment sait-elle qu'il y a un nouveau produit ou un nouveau OF ?

    Et sinon, oui mon Interface n'est pas threadé, puisque l'évenement émis par la classe SerialPort est automatiquement mis dans un autre thread.

    Si tu avais un exemple, ce serait cool, parce que dans le principe je comprends bien, mais je ne vois pas trop comment faire.

    Citation Envoyé par mat.M
    Il faut faire une programmation multi processus.
    Prendre la classe Thread et créer des objets Thread avec au besoin des AutoResetEvent
    Sinon tu ne seras pas synchro dans les événements...
    Ah ? Et pourtant il me semblait que les évenements étaient synchro.
    Pour info, j'ai essayé d'utiliser des évenements asynchrones.

    Je vais étudier cela. Merci.

    Merci pour votre aide.

  5. #5
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Citation Envoyé par Pilloutou
    Donc tu me conseilles de ne faire qu'une classe entre la classe LecteurCodeBarre et DetermineCodeBarre ?
    +1 pour la réponse de Maniak
    DetermineCodeBarre est un objet, mais son nom commence par un verbe.
    C'est pas plutôt une méthode qu'il te faudrait ?

    Sinon, pour la réutilisabilité, oui, ça pose problème si tu fusionnes une classe réutilisable d'une autre.
    Ce qu'il faut faire, selon mon expérience et mes cours de POO, c'est faire un 'super objet'

    Ex :
    * LecteurCodeBarre : réutilisable, commun à plusieurs applis
    * LecteurCodeBarrePourMachin : non réutilisable, spécifique à l'appli machin

    -> selon ta conception, soit ton lecteur spécifique hérite de ton lecteur générique, soit il le wrap (il en contient un dans un champ privé)
    -> le code de 'DetermineLecteur...' tu le colles alors dans ton lecteur spécifique.

    Avantage de l'héritage : quand tu as une opération réutilisable que tu veux appliquer sur tous tes lecteurs, par polymorphisme tu peux le faire sur ton lecteur spécifique.

    Pour le détail : on voit ça par MP, oki ?

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par Pilloutou
    Je ne sais pas si c'est ainsi qu'il faut faire.
    Ce qu'il faut faire, c'est quelque chose de propre, simple, compréhensible. Si faire des évènements permet d'y arriver, où est le problème ?

    Citation Envoyé par Pilloutou
    N'y a-t-il pas un moyen différent de faire la même chose ?
    Probablement. Y a-t-il un problème avec la manière dont tu l'as fait jusque-là ? Ça devient trop compliqué ? Pas facile à suivre ?
    Si oui, peut-être qu'il faut essayer de simplifier. Si non, pourquoi changer ?

  7. #7
    Membre éclairé
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Par défaut
    J'ai aussi un 5eme évenement qui lui par contre m'embête et me fait dire que ça devient un peu compliqué tout ces évenements.
    Un code-barre est scanné.
    La classe récupérant les code-barres génère un évenement pour transmettre ce code-barre sous forme d'une string.
    Il est attrapé par la classe qui va dire si ce code-barre est celui d'un produit ou la référence d'un OF. Si c'est celui d'un produit, cette classe va interroger la base de données pour savoir à quel produit correspond ce produit.
    Si c'est celui d'un OF, la classe va transmettre cet évenement à la classe principale de ma dll qui va à son tour transmettre ce code-barre à l'interface utilisateur en l'occurence une winforms pour que l'utilisateur puisse recevoir le code-barre de l'OF scanné et créer une nouvelle mise en production à partir de la référence de cet OF.

    Là je pense que vous êtes d'accord avec moi pour dire que ça devient un peu compliqué.

    Vous allez certainement me dire, mais dans ce cas, pourquoi l'interface utilisateur ne s'abonne pas directement à l'évenement de la classe gérant les code-barres. Ca ce n'est pas trop possible car comme je le disais le code-barre est celui d'un produit ou celui d'un OF. Tout dépend, la forme qu'il a. Et c'est le rôle d'une classe de le déterminer.

    Vous allez ensuite me dire, mais pourquoi l'interface utilisateur ne s'abonne pas directement à l'évenement que lance la classe qui détermine si c'est un produit ou un OF.
    Et là je réponds qu'en fait, j'avais choisi de ne pas mettre cette classe public pour diminuer le couplage entre ma dll et mon interface utilisateur.
    Je voulais que mon interface utilisateur n'accède à ma dll que via la classe principale de ma dll.
    Mais tout se discute.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 191
    Par défaut
    Hello,

    Pour ma part, je concois les choses de la manière suivante. Les événements sont à utiliser pour signaler une action à un moment donné, moment auquel tu ne pouvais pas spécialement t'attendre. Je veux dire par là que le seul évènement correct selon moi est le scan du code barre. Mais après cela, c'est le traitement logique à suivre => conversion en string -> recherche base de donnée...etc. Tu peux tout simplement passé des objets et pas spécialement créer des événements.

    Enfin voilà, c'est ma vision...

    Bonne chance

  9. #9
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Si tu veux éviter les événements, tu peux tenter les design pattern observer et MVC, en utilisant des interface.
    Mais si tu maîtrises bien les événements garde cette méthode.

  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
    Citation Envoyé par Royd938
    Pour ma part, je concois les choses de la manière suivante. Les événements sont à utiliser pour signaler une action à un moment donné
    Je suis assez d'accord avec ça.

    Citation Envoyé par Royd938
    Je veux dire par là que le seul évènement correct selon moi est le scan du code barre.
    Je comprends bien.
    Comme je le disais j'ai une classe qui récupère le code-barre. Une fois mis en forme sous forme d'une string, elle émet un évenement avec le code-barre sous forme d'une string. Ainsi ça permettait selon moi de faire une classe autonome qui réceptionne le code-barre et le met en forme. A moins que cette classe n'est pas d'interêt... mais elle ne peut pas appeler un autre objet de ma dll.
    Ou alors l'autre solution consiterait à utiliser une classe centrale de ma dll de réceptionner le code-barre et de faire ce qu'elle veut. J'avais pensé à cette solution, mais dans ce cas pour toutes autres application que je développerai avec une lecture de code-barre, je serai obligé de copier/coller la fonction de mise en forme du code-barre réceptionné. Voilà pourquoi j'avais évité d'utiliser cette solution.
    A moins que je m'y prenne mal .

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par Pilloutou
    La classe récupérant les code-barres génère un évenement pour transmettre ce code-barre sous forme d'une string.
    Blip.
    C'est pas un évènement que tu décris là. C'est une méthode.
    Les évènements c'est "hep y a eu un scan. ça intéresse quelqu'un ?". C'est pas pour faire du passage de paramètres :)

  12. #12
    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'est pas un évènement que tu décris là. C'est une méthode.
    Les évènements c'est "hep y a eu un scan. ça intéresse quelqu'un ?". C'est pas pour faire du passage de paramètres
    Oui oui c'est juste. Je ne sais pas ce qui m'a pris, j'ai un peu dévié, un moment de faiblesse certainement.

    Mais comme je le disais, ma démarche a été de vouloir concevoir une classe LecteurCodeBarre autonome et réutilisable. Et pour cela, je me suis dit que je ne devais pas injecter de dépendance supplémentaire en appelant depuis cette classe, qui je le rappelle reçoit le code-barre la première, la méthode d'un objet de ma couche métier pour transmettre le code-barre.

    Et pour le reste, l'idée venait de la lecture de ce document
    http://www.codeproject.com/csharp/mo...controller.asp,
    l'utilisation des évenements pour informer la vue d'un changement de la couche métier.
    Comme je disais, j'avais trouvé dans les évenements une solution qui me permettait de répercuter l'évenement de départ initié par le lecteur aux classes des couches supérieures.

    J'ai essayé la solution de Mat.m, c'est pas trop évident à intégrer mais faut que je persévère.

    Merci.

Discussions similaires

  1. Accès Aux Données Comment Faites-Vous ?
    Par predalpha dans le forum ASP.NET
    Réponses: 1
    Dernier message: 12/06/2009, 15h43
  2. Stratégie locale - sauf aux admins - Comment faire ?
    Par bilou95 dans le forum Windows XP
    Réponses: 6
    Dernier message: 16/04/2009, 16h51
  3. [VB6]Comment puis-je passer une ComboBox en argument?
    Par Xan dans le forum VB 6 et antérieur
    Réponses: 20
    Dernier message: 26/02/2007, 15h03
  4. Comment se faire passer pour IE ?
    Par Kcirtap dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 29/05/2006, 08h42
  5. Réponses: 1
    Dernier message: 23/09/2005, 18h30

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