01-12-2010, 08:57 AM
(21-08-2010, 02:14 PM)Ter Rowan a écrit : de fait chaque système est organisé ainsi : (exemple du personnage)
une classe usine de personnages qui, lorsque on lui demande de charger un ou plusieurs personnages construit la requête sql, la lance (via pdo) et génère les objets personnages
une classe personnage avec quelques attributs (l'identité du personnage)
jusque là simple
maintenant il n'y a pas les caractéristiques du personnage dans cette classe
pour les avoir, il faut interroger une autre table du modèle (toujours par la classe usine) qui générera un objet "caractéristiques du personnage" et l'attachera à l'objet personnage
évidemment on n'a pas toujours besoin d'avoir les caractéristiques (exemple "qui est à côté de moi ?")
en fait seul l'objet personnage décide du chargement de ses modules (ex module caractéristique)
pour ce faire j'ai cherché à rendre ma programmation des interractions entre système assez simple :
quand je développe un script qui nécessite les caractéristiques du personnage, je fais $perso->getModule('caracteristique')->getValeur( $idCarac);
j'ignore en écrivant cela si les caractéristiques ont été ou non chargé précédemment.
Hello,
Je répond sur cette partie, parce que je passe à peu près par là moi aussi, dés que l'on veut faire un système générique, cela revient souvent au même modèle : une table correspondant à l'objet métier avec les caractéristiques minimales, et une tables (1-n) correspondant à la spécialisation de l'objet, pouvant elle contenir autant de valeur que voulue...
Personnellement je suis passé par deux problèmes avec ce modèle (que j'ai gardé malgré tout)
- premièrement, en terme de performance, il s'avère que parfois lorsque sur la carte il y a plusieurs personnages, on finit par charger pour chaque personnage l'ensemble de ses caractéristiques (comme la skin par exemple) si l'objet usine peut renvoyer une liste de personnage avec l'objet "minimum", on aura tendance à recherche pour chaque objet les caractéristiques dans la seconde table autant de fois qu'il y a de personnage sur la map (c'est un exemple, mais ce cas peut arriver dans plusieurs situations... comme un inventaire du sac à dos)
Pour ce premier, j'ai mis en place plusieurs solution...
tout d'abord un mise en cache, pour tous les objets qui ne "vivent" pas (cas de l'inventaire) l'inventaire complet est ensuite sérializé et stocké dans un fichier (par personnage), lors du second chargement je reprend l'objet depuis le fichier, plus rapide que de tout reconstruire depuis la base de donnée.
ensuite, la mise en place d'une vue, constituant la jointure entre ces deux tables, et mon objet usine est alors capable de construire mon objet métier (et ses caracs) en une seule requête sur la vue, j'utilise cette méthode de l'objet usine dés que je dois travailler sur une collection d'objet et que je dois pouvoir consulter leurs caractéristiques, après quelques tests (dans mon cas) c'est plus rapide, il faut bien construire a vue, les clés, les jointures et ne charger que les éléments de la collection dont on aura besoin et ça roule.
Le second problème... heu... et bien je l'ai oublié en écrivant tout ça (c'est le matin pas encore bien réveillé) j'en reparlerai donc plus tard quand ça me reviendra...