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

Design Patterns Discussion :

[Pattern][Event] Comment prendre en compte les évènements programmés ?


Sujet :

Design Patterns

  1. #1
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut [Pattern][Event] Comment prendre en compte les évènements programmés ?
    Bonjour,


    J'ai une question de conception à vous poser. Je vais vous le poser sous forme de problème, pour ne pas être influencer par la technologie utiliser.

    Soit un bâtiment qui produit X unité de ressource toutes les heures.

    Pour mettre à jour le nombre d'unité disponible, on prend le delta entre la dernière mise à jours et la mise à jours actuelle. Pour avoir quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ressource_Dispo = Ressource_Dispo + (Production_Bâtiment * Delta / 3600)
    (Si Delta en seconde)

    Le problème vient maintenant :
    Si posons qu'on programme un Event entre la dernière mise à jour et notre mise à jours qui change la production du bâtiment.
    On connait sa date et les changements que cette Event va produire. Mais nous ne pouvons pas réaliser la modification au moment théorie où va se produire cette Event. Mais seulement lors de notre mise à jours.

    La question que je me pose est :
    • Comment prendre en compte les évènements programmées quand on ne peux pas les réaliser à la date prévue ?
    • Quel Pattern est adapté à la résolution de ce problème ?


    J'ai pensé à la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1. Mise à jours des ressources
    1.A Recherche des Event à réaliser
    Pour tout les Event E
    1.A.1 Mise à jours des ressources entre la dernière mise à jour et l'Event E
    1.A.2  Réalisation de l'Event E
    1.B Mise à jours des ressources entre dernière mise à jour et maintenant.
    Cela me fait penser au pattern "Command pattern"

    Mais je ne suis pas sûr...

    Si vous avez des pistes sur cela ! Je prends aussi tout les commentaires !

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  2. #2
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 560
    Points : 7 255
    Points
    7 255
    Par défaut
    Bonjour,

    Ta méthode est tout à fait valable et est assez répandue: tu programme tes évènements de telle façon qu'ils s'exécutent, et lorsqu'ils ont fini de s'exécuter ils ajoutent un message à une file d'attente (JMS, table de jobs en BDD, ...).

    Lors d'une mise à jour, tu commence par la mise à jour puis tu dépile cette file d'attente pour jouer les messages et modifier les données comme il faut.

    L'avantage est que tes évènements sont indépendants (couplage faible et indépendance technologique) de la partie qui effectue la mise à jour.
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Merci beaucoup pour cette réponse !

    Du coup,

    Je me pose une question sur la gestion des échelles.

    Si on prend un système très large, si on reprend mon exemple du bâtiment qui produit.
    Si on multiplie le nombre de bâtiment qui produit. (un million par exemple)
    Et qu'on conditionne l'effet/déclenchement d'un évènement par la production d'un bâtiment.

    Dans la solution que j'ai, je mets l'ensemble de la production des bâtiments à jours, avant de réaliser mon event.
    Ce qui peut prendre un temps assez long...

    Dois-je altérer la solution en ajoutant aux Event les bâtiments qui doivent être mise à jours avant leur exécution ?

    Cela complexifie légèrement la solution, mais permet d'avoir quelque chose d'un peu moins coûteux en ressource.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    S'il y a beaucoup d'entité à mettre à jour, je changerais la manière d'organiser les mises à jour.

    Par exemple en créant des objets "Mise à jour" (un pour chaque bâtiment), et en ajoutant les évènements dans les objets "Mise à jour".

    On peut alors traiter séparément chaque mise à jour (parallélisation, priorité, ...)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Très bonne idées !
    Cela évite la recherche des évènements à exécuter pour un bâtiment donner.
    Surtout que cela représente la plus grande partie du temps de calcule dans le processus que j'ai testé :

    Sur une implémentation Java, on obtient des résultats très différents entre la première solution et la seconde :

    Premier cas de test :
    nombre de building = 1000;
    nombre d'event = 20000;
    1 event : Une cible, Deux Bâtiment à mettre à jour (dont la cible)
    Résultat :
    Citation Envoyé par Event General
    Time to process one building 12449 ms on 1000
    With 28787 building updates and 14393 events done
    Time on find events 11413 ms
    Time to process all buildings 1130 ms on 1000
    With 12214 building updates and 5607 events done
    Time on find events 1041 ms
    Citation Envoyé par Event building
    Time to process one building 123 ms on 1000
    With 28183 building updates and 14091 events done
    Time on find events 42 ms
    Time to process all buildings 28 ms on 1000
    With 12818 building updates and 5909 events done
    Time on find events 7 ms
    Second cas de test :
    nombre de building = 100000;
    nombre d'event = 100000;
    1 event : Une cible, Deux Bâtiment à mettre à jour (dont la cible)
    Citation Envoyé par Event General
    Time to process one building 26 ms on 100000
    With 1 building updates and 0 events done
    Time on find events 24 ms
    Time to process all buildings 1172393 ms on 100000
    With 300000 building updates and 100000 events done
    Time on find events 1143782 ms
    Citation Envoyé par Event building
    Time to process one building 2 ms on 100000
    With 1 building updates and 0 events done
    Time on find events 1 ms
    Time to process all buildings 671 ms on 100000
    With 300000 building updates and 100000 events done
    Time on find events 106 ms
    Il est clair que la localisation des évènements dans le programme, leur gestion impacte directement les performances générales de l'application.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008] LIKE sur NCHAR : comment prendre en compte les espaces signifiants ?
    Par Etanne dans le forum Développement
    Réponses: 12
    Dernier message: 14/05/2014, 18h34
  2. Réponses: 7
    Dernier message: 16/11/2011, 15h18
  3. Réponses: 4
    Dernier message: 05/02/2011, 21h09
  4. [RegEx] Comment prendre en compte les caractères accentués ?
    Par jfrag dans le forum Langage
    Réponses: 8
    Dernier message: 12/02/2008, 18h34
  5. [plugin][tomcat] Comment prendre en compte les jar ?
    Par djodjo dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 08/04/2004, 20h47

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