JeuWeb - Crée ton jeu par navigateur
[Architecture applicative]qu'en pensez vous ? - 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 : [Architecture applicative]qu'en pensez vous ? (/showthread.php?tid=4453)



[Architecture applicative]qu'en pensez vous ? - Ter Rowan - 19-11-2009

Coucou

comme je retente (et repense) complètement mon projet j'aurais voulu avoir votre avis sur le modèle que je mets en place.

Comme je vais avancer sur un mode itératif je ne vous sollicite que sur une partie, qui plus est "générique"

exemple de la situation (le côté générique est qu'on oublie les termes :
n personnages combattent entre eux
pour ce faire, j'ai besoin de quelques caractéristiques des personnages (Vie pour simplifier) et de la stratégie que chacun appliquera (on dira pour résumer, une succession d'action)

pour cela j'imagine une classe personnage :

Code PHP :
<?php 
class personnage
{
protected
$id; //l'identifiant unique du personnage
protected $vie; //les points de vie du personnage

protected $strategie; // un tableau de chaines correspondant à l'action
protected $indiceStrat; // état d'avancement de la stratégie (à quelle étape nous en sommes)
protected $adversaires; // un tableau contenant la liste des adversaires (des instances de la classe personnage)

// a cela diverses méthodes puis

function ajouteAdversaire (personnage $adversaire)
{
$this->adversaires[] = $adversaire; // le tableau des adversaires contient les personnages pour pouvoir utiliser toutes leurs méthodes
}

function
setStrategie($liste) //liste sera un tableau de chaine
{
$this->strategie = $liste;
}

function
Action()
{
// on crée un objet Action qui permet de résoudre l'action (je me base sur le design pattern strategy que me proposait Pascal)
$classeAction = $this->strategie[ $this->indiceStrat];
$this->indiceStrat++; // pour le prochain appel, on sollicitera l'action suivante
$act = new $classeAction ($this); // en envoyant $this, mon action connait et le personnage et ses adversaires et peut donc demander toutes les informations qui vont bien

if ( $act->estPossible () ) // contrôle
$act->realise(); // action
else
$this->ActionEnEchec(); // gère l'échec de l'action pour le personnage (perte de moral, suite à la contrariété de ne pas avoir fait ce qui était prévu, etc...)
}
}

Supposons que toutes les classes possibles actions se ressemblent

Code PHP :
<?php 
class action1 /// (ou action2, action4, ...)
{
protected
$personnage
function __construct(personnage $personnage)
{
$this->personnage = $personnage;
}

// la méthode de test, spécifique à chaque classe action, vérifiant l'état du personnage voire de ses adversaires
function estPossible()
{
if (
$this->personnage->getVie() > 33 && $this->personnage->getZZZ() != .... )
return
true;
else
return
false;
}

function
realise()
{
//on choisit l'adversaire en fonction d'un algorithme compliqué, ici le 26eme adversaire
$adversaire = $this->personnage->getAdversaires()[25]; //pas vérifié que j'arrivais a capter en un seul coup le 26eme adversaire du personnage comme cela mais on dira que oui, sinon en deux étapes

// on impute à l'adversaire 62 points de dégat
$adversaire->degats(62);
}
}

voilà évidemment le code ne marche pas mais je pense qu'on voit bien les interactions entre les différentes classes

et là je m'interroge, est ce que je fais des références croisées qui vont tout planter, est ce que je suis parti dans le délire le plus total, etc...

de même sur le côté j'instancie un objet action (remarque peut être qu'il est la pertinent d'être dans un singleton justement - remplacer $act = new $classeAction ($this); par $act = $classeAction::getInstance($this);)

oubliez qu'on est en sur du combat, ça pourrait très bien être une gestion d'échange boursier ou je sais pas quoi, l'idée étant vraiment d'évaluer la manière de coder plus que le "métier"

en plus si pour optimiser (cf mon poste sur singleton et compagnie) j'ai aussi une classe qui récupère et donc instancie tous les personnages ça me fait des références d'un même objet dans plein d'endroits.

voilà si vous avez des conseils, remarques (pas sur l'aspect nommage, commentaire, indentation, j'ai tout tapé sur l'éditeur de discussion de jeuweb ^^) ou identifiez des lacunes, impossibilités, etc... je m'en remets a vous avant d'aller plus loin Smile merci !


RE: [Architecture applicative]qu'en pensez vous ? - Crimson - 21-11-2009

Personnellement j'ai un peu du mal à comprendre. En même temps je suis pas là depuis longtemps. ^^
Et je dois dire que je vois mal ce que tu demandes.

Apres j'aurais des commentaires à faire mais je ne sais pas si ce que je pourrais dire sera pertinent ou pas.

Edit:
Du style passage par référence dans les fonctions, classes actions utilisant l'héritage, pourquoi ne pas faire un classe action qui soit plus "utilitaire" et générale qu'une entité unique pour chaque action,...


RE: [Architecture applicative]qu'en pensez vous ? - Ter Rowan - 21-11-2009

(21-11-2009, 01:17 PM)Crimson a écrit : Personnellement j'ai un peu du mal à comprendre. En même temps je suis pas là depuis longtemps. ^^
Et je dois dire que je vois mal ce que tu demandes.
oui c'est vrai que ce ne doit pas être forcément très clair, mais je ne sais pas trop quoi exprimer d'autres pour clarifier ^^ me faudrait peut être un peu d'aide la dessus, voire des questions auxquelles je puisse répondre

(21-11-2009, 01:17 PM)Crimson a écrit : Apres j'aurais des commentaires à faire mais je ne sais pas si ce que je pourrais dire sera pertinent ou pas.
bah c'est toujours plus pertinent que rien ^^

(21-11-2009, 01:17 PM)Crimson a écrit : Du style passage par référence dans les fonctions,
de ce que je sais mais ça se trouve c'est une fausse croyance, il est inutile de passer par référence des objets (contrairement à des entiers, etc..) depuis php 5 (4?), il le fait de lui même

(21-11-2009, 01:17 PM)Crimson a écrit : classes actions utilisant l'héritage, pourquoi ne pas faire un classe action qui soit plus "utilitaire" et générale qu'une entité unique pour chaque action,...
alors je suis encore un peu moins à l'aise pour répondre la dessus car je viens juste de mettre en pratique ce modèle (enfin j'ai essayé de faire un pattern strategy, me suis peut être planté)

globalement. Il y aurait une classe action "racine" donc les autres hériteraient, mais le fait de faire une super grosse classe qui gère tout (exemple soigner une personne, fuir, frapper avec une arme, soigner tout le monde, lancer un sort sur cible unique, lancer un sort sur cibles multiples, lancer une grenade, etc...) ferait un code assez illisible et inmaintenable pour tout prendre en compte, d'où cette notion de spécialisation de diverses
classes héritant d'une globale


RE: [Architecture applicative]qu'en pensez vous ? - Crimson - 21-11-2009

(21-11-2009, 01:32 PM)Ter Rowan a écrit : globalement. Il y aurait une classe action "racine" donc les autres hériteraient, mais le fait de faire une super grosse classe qui gère tout (exemple soigner une personne, fuir, frapper avec une arme, soigner tout le monde, lancer un sort sur cible unique, lancer un sort sur cibles multiples, lancer une grenade, etc...) ferait un code assez illisible et inmaintenable pour tout prendre en compte, d'où cette notion de spécialisation de diverses
classes héritant d'une globale

Ok, je vois pourquoi ne pas faire une classe globale pour toutes les actions. Mais pourquoi pas une classe pour tous les même type d'action, plutôt qu'une classe par action comme cela semble être le cas ici ? (En plus clair une classe a qui tu pourrais successivement passer des personnages pour réaliser la meme action)

Parce que si j'ai bien compris, si le personnage doit faire une action1 alors tu crées une instance de la classe action1 dédiée à ce personnage, mais si il fait 4 fois une action1 ? Ou si 4 personnages différents doivent faire une action1 ? ça donnera 4 instances différentes ?


Apres j'ai pas vraiment l'habitude des patterns, je code plus par expérience. ^^ Donc mon résultat n'est surement pas très académique mais dans ce genre de cas j'aurais fait une classe action super balaise qui contiendrait toutes les actions. Ce serait une classe utilitaire.

Chaque action possible serait si possible une fonction et lors du parcours des actions à réaliser je ferais des appels $ma_classe_action->$type_action($le_personnage);

Mais bon là j'ai un peu du mal à voir ce que tu attends. ^^


RE: [Architecture applicative]qu'en pensez vous ? - Ter Rowan - 21-11-2009

ah oki, ce n'est pas de classe dont tu parles mais d'objet instancié
bah je te rejoins en partie la dessus, d'où ma remarque sur le premier post :

(19-11-2009, 08:55 PM)Ter Rowan a écrit : de même sur le côté j'instancie un objet action (remarque peut être qu'il est la pertinent d'être dans un singleton justement - remplacer $act = new $classeAction ($this); par $act = $classeAction::getInstance($this);)