JeuWeb - Crée ton jeu par navigateur
modéliser la gestion d'événements - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : modéliser la gestion d'événements (/showthread.php?tid=3849)



modéliser la gestion d'événements - Ter Rowan - 05-04-2009

yop, j'essaie de construire un système d'événement amenant à une mise à jour de base de données (exemple statistiques d'un match)

ce que j'appelle événement c'est par exemple :

x marque un but contre y / x coupe le bras de y
x rate sa passe / x rate son attaque
l'équipe 1 bat l'équipe 2 / x a tué un loup
etc...

derrière je calculerais différents indicateurs ( nombre de victoires/défaites de l'équipe 1 par l'équipe 2, etc...)


mes hypothèses :

un script php se lance pour résoudre une action (ou une succession d'actions tel un match ou un combat, ou ...) les éventuels résultats directs à long terme sont inscrits dans la bdd via ce script ou des objets dédiés (y perd un bras, équipe 2 éliminée du tournoi, score de demi finale, épée cassée, ....)

par contre j'aimerais construire l'objet générique qui gèrera les statistiques (ou haut fait, quelque part c'est la même chose)


j'ai pensé à ne construire qu'un objet instancié pour chacun des scripts concernés, c'est lui qui recevra les événements, et en fonction de chaque, calculera les indicateurs associés

toto = new gestionnaireEvenement();

et, à chaque événement possible, je ferais un

toto->ajouteEvenement( x,y,z, ....);

A partir de là je ne sais pas trop comment avancer car tous les événements n'ont pas autant de paramètre

exemple "rater une passe" ne nécessite aucun paramètre, en dehors, de qui a raté la passe

mais "marquer un but", ou "dribler", ou "vaincre", nécessite de connaître le gagnant et le vaincu

on pourrait aussi avoir à connaitre nombre de but en moins de x minutes ou encore minimum entre deux buts marqués, ce qui nécessiterait d'envoyer des paramètres de temps pour certaines actions

maintenant je ne pense pas, tant pour la performance, que pour la lourdeur du code, qu'il faille construire une méthode avec tous les arguments possibles et inimaginables et les renseigner dans tous les cas (mais bon je me trompe peut être)

du coup je ne sais pas trop quelle mécanique adoptée pour construire cette affaire... Avez vous une idée ?

de même si vous avez une autre vision de la chose, n'hésitez pas, je n'ai encore rien construit, donc je suis preneur Smile


RE: modéliser la gestion d'événements - Shao - 05-04-2009

Au lieu de passer par plein de paramètres que tu ne rempliras pas forcément, ton gestionnaire d'évènements pourrait recevoir en paramètre un évènement qui serait capable de se "gérer" lui même.

Exemple : Le drible (en supposant que tu aies déjà le gagnant et le vaincu ) :
Code PHP :
<?php 
$evenement
= new DribleEvent( $gagnant, $vaincu ) ;
$gestionnaire->ajouterEvenement($evenement) ;

Ensuite lors de la phase de sérialisation, le gestionnaire va parcourir sa liste d'évènements et leur demander de se sérialiser (ce qui t'évite d'avoir à vérifier si tes paramètres sont remplis dans un cas et pas dans l'autre).

Je trouve cette approche assez pratique car si un jour on souhaite ajouter un nouvel évènement, on a pas besoin de toucher au code du gestionnaire lors des phases d'enregistrement, de chargement etc... car c'est l'évènement lui même qui sait gérer ça. Smile
Et bien entendu ça évite plein de if...elseif dans ton gestionnaire car ce n'est pas à lui de décider comment gérer les données de ses évènements car il n'a pas besoin de les connaître pour pouvoir s'en servir, il sait juste que ce sont des évènements et qu'ils ont tous des méthodes communes dont il pourra se servir. :p

Voilà j'espère avoir été compréhensible. x)


RE: modéliser la gestion d'événements - Ter Rowan - 05-04-2009

merci de ta réponse

j avais pensé au début a faire un truc de ce genre mais ça me pose problème...

en effet si j ai 5 fois dans le match l'événement "toto drible titi", et trois fois "toto drible tutu" je me retrouve avec 8 événements dribleEvent (en prenant ton exemple) instanciés

or comment agréger ?
je n'ai pas envie de faire :

- 5 fois : requete "update dribleAdv set +1 where toto, titi"
- 3 fois : requete "update dribleAdv set +1 where toto, tutu"
- 8 fois : requete "update dribleGeneral set +1 where toto"

mais plutôt une fois :

- une requete SQL "update dribleAdv set +5 where toto, titi"
- une requete SQL "update dribleAdv set +3 where toto, tutu"
- une requete SQL "update dribleGeneral set +8 where toto"

donc pour moi, les méthodes de mise à jour des tables ne doivent pas être dans les classes du type dribleEvent mais dans la classe gestionnaire

je me trompe ?


RE: modéliser la gestion d'événements - Shao - 05-04-2009

Hum... pas forcément, ton DribleEvent n'est pas obligé directement de taper dans la base.
D'après ce que je comprends, il y a 2 étapes importantes dans ton système :
- L'ajout d'événement dans ton gestionnaire
- La sérialisation de ton gestionnaire dans la base

On a je pense 2 possibilités pour ton gestionnaire :
1) Pendant l'ajout d'un évènement, on demande à ce dernier de se stocker lui même dans le gestionnaire (ou dans une partie "modèle" du gestionnaire). Une fois qu'on aura ajouté tout les évènements, on fera la/les requêtes SQL du modèle construit au fur et à mesure.
2) Quand tout les évènements ont été ajoutés, on passe dans chacun des évènements afin de construire le modèle. On peut ensuite faire pareil que dans 1) c'est à dire sérialiser notre modèle dans la base de données.

Personnellement je préfère la première solution, cela nous évite de faire une boucle sur tout les évènements pour construire notre modèle.

Dans notre gestionnaire on aura par exemple une propriété data qui contiendra l'ensemble de nos données à insérer dans notre base.
Voilà à peu pres comment j'imagine la méthode d'ajout d'évènement au sein du gestionnaire
Code PHP :
<?php 
function ajouterEvenement( $evenement )
{
$evenement->addData($this->data) ;
}

Et dans notre classe DribleEvent on a :
Code PHP :
<?php 
function addData( $data )
{
//Exemple sous forme de tableaux (un systeme oriente objet reprendrait le meme principe)
$data['dribles'][$this->gagnant][$this->perdant] += 1 ;
}

Bon ici c'est un exemple avec des tableaux et j'utiliserai plutôt un système objet pour insérer mes données. Mais le principe est là, il te suffit juste d'insérer les données sous le format que tu souhaites grâce à ton évènement. Et si tu as un évènement différent, il ira se stocker sur des données différentes au sein de ton gestionnaire.

A la fin le gestionnaire convertira son modèle dans la base de données, il y aura donc probablement une méthode pour déclencher ça (un convertSQL() par exemple ^^).

Ce système s'inspire beaucoup du Design Pattern Visitor, je t'invite à aller rechercher plus d'informations sur ce Design Pattern si mes explications sont un peu trop floues (ou si j'explique mal :p).


RE: modéliser la gestion d'événements - Ter Rowan - 05-04-2009

j'envisage mieux ce que tu décris

c'est encore un peu flou mais je vais analyser cette affaire Smile

je reviendrais surement sur ce fil mais il va me falloir un peu de temps pour creuser Smile


Y a peut être d'autres pistes à explorer, si certains ont des idées, mais déjà je vais fouiller celle là

merci encore !