JeuWeb - Crée ton jeu par navigateur
Vous avez dit MVC? - 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 : Vous avez dit MVC? (/showthread.php?tid=804)

Pages : 1 2


Vous avez dit MVC? - joshua - 14-02-2007

Bon je touche quelques mots sur le modele MVC que malheureusement peu connaissent.
Alors MVC, qu'est ce que ça veut dire?
--> Il s'agit d'un modèle d'organisation du code étudié pour permettre de bien isoler chaque couche du code.
  • Model
Le modèle contient tous les accesseurs à la base de données. En gros, toute mise à jour de la base de données passe forcément par le Model. D'autre part, il doit s'agir d'accesseurs simples et non d'acesseurs spécifiques liés au projet.

Citation :Je veux acheter 3 tomates:
Mon model, la classe client_db va comporter un accesseur prendre objet et un accesseur payer objet
  • le controller
Le controleur est là pour décrire via des fonctions notre besoin. Il s'appuie sur les accesseurs mais reste "générique"
Citation :Ma classe client descend de ma classe client_db.
Elle définit la méthode acheter (objet, nombre) qui prend n objet puis paye n objet.
  • la view
Ma view correspond a mon code html, à ma mise en forme.
finissons en avec notre exemple
Citation :la view créé un objet client (new client)
et passe la méthode client->acheter(tomate, 3) dans un echo pour que le resultat s'ecrive dans la page.



RE: Vous avez dit MVC? - Sephi-Chan - 14-02-2007

Hm. A première vue ça à l'air de n'être que des contraintes.

Puis je ne pense pas que dans la pratique ça ressemble à ces exemples d'école.
De plus, l'utilité d'une telle mise en place ne se voit, je suppose, que quand toute l'application est pensée pour fonctionner comme ça. Aussi ces quelques exemples ne sont à mon sens pas suffisant.

Est-il obligé d'utiliser l'OO pour bien s'en servir ? Quel est la réelle utilité d'un tel système ? Etc.


Sephi-Chan, curieux.


RE: Vous avez dit MVC? - joshua - 14-02-2007

Oui, le mvc est un standard de l'objet, implémenté a l'origine pour java.
C'est une manière de coder rigoureuse et de savoir ou sont ses petits.... alors oui, il y a des contraintes, mais ca evite d'avoir le code degueu qu'on a dans la majeure partie des sites, avec php, html et accès pases mélangés.
Le mvc est naturel, donc facile a maintenir


RE: Vous avez dit MVC? - Sephi-Chan - 14-02-2007

Damned!

Tout tourne donc autour de l'objet...
Je crois bien que je vais devoir me lancer avant d'avoir des cours où quoi que ce soit.
Si je le fais maintenant, ça m'évitera d'avoir à penser à une V2 de mon jeu alors même que la V1 est en développement ^^.

Tu aurais des pistes pour m'aider à me lancer, Joshua ?
Si tu es d'accord j'aimerai bien pourvoir en parler avec toi via MSN. Si tu acceptes, voici mon adresse : sephichan_AT_hotmail_DOT_com


Sephi-Chan


RE: Vous avez dit MVC? - Seren - 14-02-2007

Comme tous les formalisme, on ne voit pas forcément l'intéret quand on a que quelques tables et fonctions, mais plus les systèmes deviennent complexes plus ça devient dur à gérer.

Je connais pas le concept de MVC mais j'imagine qu'appliquer à un jeu php, ça se découperait comme ça :

- le modèle, c'est la base de donnée et ses accès. La façon dont sont organisées les données.
- le controleur, c'est la façon d'agir sur ses données, en gros ça va correspondre à toutes les actions, événements possible dans le jeu.
- la vue c'est juste la mise en forme des résultat de l'action ou autre sur le site.

L'intéret c'est que si les trois fonctions sont séparées clairement, tu peux modifier plus facilement une seule partie sans tout refaire.

Par exemple, si tu veux juste modifier l'apparence de ton site, normalement tu devras pas toucher aux accès à la BDD. (En pratique sans suivre un modèle rigoureux ça devrait être le cas.)

Autre exemple tu veux ajouter une "action" supplémentaire dans le jeu, la possibilité de "sauter", normalement tu vas agir uniquement que sur la partie controleur. Le modèle et la vue ne seront pas impacter.

La relation avec la programmation POO c'est que quand tu vas créer un objet, il faut que les méthodes soient dans une seule catégorie.
- la partie modèle qui se connecte juste à la BDD (par exemple le constructeur pour initialiser l'objet)
- une partie controlleur, qui traite des données abstraites pour effectuer une action (par ex: function attaquerCible() )
- une partie vue ( par ex : function displayCombatResult())

Tu veux changer le fond d'écran de noir en blanc ? Il suffit de modifier la fonction displayCombatResult sans toucher au reste.

Tu veux changer le système de combat ? Tu dois modifier que la fonction attaquerCible. L'affichage restera le même.

Sans POO tu peux quand même faire du MVC en séparant bien tes fonctions selon ces trois catégories.

En gros ce qu'il faut éviter de faire, c'est des fonctions ou méthodes qui se connectent à la BDD, font un calcul et affichent le résultat. Parce que dès que tu vas vouloir modifier un seul truc dans ton jeu il va falloir réécrire toutes les fonctions.



(Pffiou c'était long...)


RE: Vous avez dit MVC? - denisc - 14-02-2007

j'ai compris pareil...
en plus court LOL


RE: Vous avez dit MVC? - Sephi-Chan - 14-02-2007

Je suis d'accord sur le principe, l'utilité est grande.

Toutefois je pense que rien n'est jamais si rose :

Seren a écrit :Autre exemple tu veux ajouter une "action" supplémentaire dans le jeu, la possibilité de "sauter", normalement tu vas agir uniquement que sur la partie controleur. Le modèle et la vue ne seront pas impacter.
Et dans ce cas, comment tu dit-on à l'utilisateur "Vous avez sauté" ? Il faut bien modifier les différentes couches.

Seren a écrit :Tu veux changer le système de combat ? tu dois modifier que la fonction attaquerCible.
A nouveau, ça m'étonnerai que ce soit si facile. Si on modifie un système c'est pour integrer de nouvelles choses, il y aura forcément des choses à changer dans le view. Peut-être cela sera plus simple que sur un jeu codé plus "salement", mais il faudra tout de même le faire.

Seren a écrit :Tu veux changer le fond d'écran de noir en blanc ? Il suffit de modifier la fonction displayCombatResult sans toucher au reste.
Oui, le HTML/CSS est une partie de la couche view.

En somme tout ça à l'air très interessant, mais il faudrait voir un site-témoin qui utilise ça, le genre de site courant, news, livre d'or, articles et commentaires. Et avoir accès à son code, pour bien comprendre.


Sephi-Chan


RE: Vous avez dit MVC? - denisc - 14-02-2007

Regardes les sources de phpbb. C'est un peu ce principe qui est utilisé.


RE: Vous avez dit MVC? - Seren - 14-02-2007

Petit exemple vite fait :

Partie Modèle:
Code PHP :
<?php 
// Enlève $x point de vie au personnage identifié par $id
function removeHP($id, $x)
{
mysql_query("SELECT perso.HP FROM Table_Perso where perso.pid'". $id ."'");
mysql_query("UPDATE Table_Perso SET HP =". $HP - $x." WHERE Perso.pid='".$id"'");
}

Partie Controlleur :
Code PHP :
<?php 
// une fonction d'attaque simple qui enlève dix points de vie.
function Attaquer($attaque, $defense, $cible)
{
if(
$attaque > $defense)
removeHP($cible, 10);
}

Maintenant tu te dis que tu veux changer ton système de combat. Tu voudrais gérer les coups critiques. Tu décides que si l'attaque est deux fois plus grande que la défense alors tu fais des dommage en plus.
Il suffit de réecrir la fonction attaquer.

Code PHP :
<?php 
// une fonction d'attaque plus complexe.
function Attaquer($attaque, $defense, $cible)
{
$degat = 0;
/* cas simple reste identique */
if($attaque > $defense)
$degat = 10;
/* coup critique !! */
if($attaque > (2 * $defense) )
$degat = $degat + 20;

removeHP($cible, $degat);
}

Voilà tu as changer ton système de combat en modifiant que une fonction de la partie controlleur. La partie modèle qui accède à la base de donnée n'a pas été modifié.

C'était assez facile non ? Smile

(c'est coder avec les pieds y a surement trois fautes pas ligne)


RE: Vous avez dit MVC? - joshua - 14-02-2007

Totu a fait ca Seren. A une petite différence de terminologie:
Le modele, ce sont les accepsseurs a la bdd.
Le controlleur, c'est la couche ou l'on créé les fonctions que l'on veut utiliser par la suite à s'appuyant sur les accesseurs (donc sur le model)
La view, ca n'est que l'application des fonctions a des cas précis.
En gros: La view c'est ton jeu, le controlleur c'est les fonctions qui font vivre ton jeu, et le model c'est le lien entre ta bdd et tes fonctions définis dans le controlleur.
Autre maniere de le dire, si demain je change de type de BDD, je n'ai que le model a modifier.
Si je veux changer le visuel, je ne touche qu'a la view.
Et si je veux ajouter/retirer/modifier des actions, je touche au controller.