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

Langage PHP Discussion :

Classe ou fonction dans le model? [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 107
    Points : 86
    Points
    86
    Par défaut Classe ou fonction dans le model?
    Bonjour à tous, encore moi
    Je débute en OO, et je me dépatouille tout juste avec les classes, cependant, le concept, j'ai du mal à ce que ce soit clair dans ma tête.

    Et là, c'est tout brouillon !

    Je développe un petit projet de jeu web php (avec zend), donc j'ai mon controller, qui va allez assez souvent chercher les informations du personnage et les instanciers sous forme d'objet.
    Donc hop, mon controller tape dans le model core, qui va allez instancier l'objet en allant taper dans la classe Personnage, et le retourne au controller.
    Il fait la même chose pour un item quelconque, et pour l'inventaire.

    Cependant, j'ai un problème de 'concept', lorsque j'aborde le sujet 'des skills' (compétence, des sorts quoi).
    En gros, je veux faire en sorte, que lorsque le personnage est en combat, il puisse voir les skills qui sont disponible, et les utiliser.

    Alors faut il que je crée un classe skill? dans laquelle je met le nom, le level, ect ect ..(yen a pas bien long), et vu qu'un personnage peut en avoir plusieurs, que j'attache les objets ...
    ou bien simplement que je crée une fonction dans mon model qui va me permettre d'allez chercher les infos que je veux, et qui retourne un tableau?

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Points : 98
    Points
    98
    Par défaut
    C'est plus propre et plus souple si tu définis tes skills dans la BDD. Ca te permettra de modifier / Ajouter / virer des skills sans avoir à modifier ton code.

    Il te suffit de créer une entité "Skill", dans laquelle tu stock le nom, la description, le lvl requis, la classe concernée (si tu as des classes), ... Toutes les infos utiles.
    Tu fais ensuite une liaison de type "Many To One" (N -1) depuis "Skill" vers "Personnage".

    A toi d'adapter ensuite à ton fonctionnement (par exemple : limiter à un nombre de skill max à la fois comme on peut voir sur la plupart des RPG).

  3. #3
    Membre actif Avatar de Ethan 0x21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Points : 261
    Points
    261
    Par défaut
    Bonjour Sereine,


    Je pense que votre probléme n'est pas inhérent a la poo mais à un concept qu'il est bon d'appliquer avant de commencer a coder, à savoir le modéle conceptuel des données, tel que Merise, qui vous permettra de modéliser toutes vos entités relatives à votre projet et pouvoir connaitre clairement comment organiser le tout dans la base de donnée d'une part, puis dans le code source car sa en découlera implicitement.


    Cdt

  4. #4
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 107
    Points : 86
    Points
    86
    Par défaut
    Mes skills sont déjà en base de donnée, et dépende de la classe et non du personnage. Les relations sont déjà faite.

    Ayant déjà fait du merise, en revanche, je vois pas comment ça peut résoudre mon problème? j'ai opté pour la solution de la classe au final.

  5. #5
    Membre actif Avatar de Ethan 0x21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Points : 261
    Points
    261
    Par défaut
    Ayant déjà fait du merise, en revanche, je vois pas comment ça peut résoudre mon problème? j'ai opté pour la solution de la classe au final.
    Le modéle conceptuel des données influt directement le modéle relationnel des donnée (les tables de votre base de donnée), et donc il permet ensuite de mieux comprendre la maniére dont les différents objets intéragissent entre eux ainsi comment ensuite les modélisé dans le code sous forme de classe ou de classe simple structure de donnée (à l'instar des struct du C), ce qui semble vous posez probléme.

    Ceci dit, aprés tout le monde est différent.

  6. #6
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 107
    Points : 86
    Points
    86
    Par défaut
    Oui, mais ce que je comprend pas, c'est à quel moment il faut que j'implémente la fonctionnalité dans la classe et à quel moment je dois le faire dans le model?
    Le résultat pour moi est le même.

    Tout comme là, je devais faire afficher les skills disponible pour tel personnage, avec l'action qu'implique ce skill, et la valeur de l'action.

    En gros j'aurais pu:
    - Récupérer mon objet personnage
    - Récupérer la classe de personnage à partir de cet objet ('genre archer, ...)
    - Faire une recherche dans la base de donnée à la table skill, à partir de l'id de la classe et du niveau du personnage
    - Récupérer sous forme de table le résultat de la requête, et faire afficher les colonnes qui m'intéresse dans la vue.
    - Mettre cet array directement dans un paramètre de l'objet personnage, comme ça, dès qu'on récupérer le personnage, on a directement l'array skill

    Ou bien:
    - Créer une classe Skill, ajouter tous les get/set + l'hydratation à la construction de l'objet
    - Dans le model, récupérer la classe de personnage à partir de l'objet Personnage qui est passé en paramètre de la fonction
    - Faire une recherche dans la base de donnée à la table skill, à partir de l'id de la classe et du niveau du personnage
    - Pour chaque ligne du tableau résultant de la requête, créer un objet Skill, qui va hydrater les données du tableau
    - Utiliser SplObjectStorage pour attacher les objets, la fonction retourne donc le 'pack' d'objet skill
    - Rattacher la fonction à celle du 'GetPlayer' qui va instancier l'objet personnage, et rajouter en paramètre à ce personnage, le 'pack skill'

    En gros, le resultat est le même, et pour l'utilité de l'objet skill, j'aurais peut être du simplement faire un array, car au final, c'est pas l'objet skill qui va faire quelque chose, enfin bref je sais pas..


    Controller:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $MGame = new Home_Model_DbTable_CoreGame();
    $perso = $MGame->getPlayer($this->perso_exist);
    $this->view->perso = $perso;
    Model:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    function getPlayer($id) {
            $ModelPersonnage = new Home_Model_DbTable_Game_Personnage();
            $arrayPlayer = $ModelPersonnage->getPlayerById($id)->toArray();
            $perso = new Personnage($arrayPlayer);
            $skills = $this->getSkills($perso);
            $perso->setSkills($skills);
           ...
            return $perso;
        }
     
        function getSkills(Personnage $perso) {
            $ModelSkills = new Home_Model_DbTable_Game_Skills();
            $ModelClasse = new Home_Model_DbTable_Game_Classe();
            $ModelProperty = new Home_Model_DbTable_Game_Property();
            $classe = $ModelClasse->getClasseByName($perso->classe());
            $skills = $ModelSkills->getSkillByClasseAndLvl($classe->id_classe, $perso->lvl())->toArray();
            $storage_skill = new Skills();
            foreach ($skills as $skill) {
                $skillobject = new Skills($skill);
                $property = $ModelProperty->getPropertyById($skillobject->attr());
                $skillobject->setActionproperty($property->action);
                $storage_skill->attach($skillobject);
            }
     
            return $storage_skill;
        }
    Classe skill

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    class Skills extends SplObjectStorage {
     
        private $_id_skill;
       ...
        private $_lvl;
        private $_action;
     
    public function __construct($donnees = null) {
            if (isset($donnees) && $donnees != "") {
                $this->hydrate($donnees);
            }
        }
     
        public function hydrate(array $donnees) {
     
            foreach ($donnees as $key => $value) {
                $method = 'set' . ucfirst($key);
     
                if (method_exists($this, $method)) {
                    $this->$method($value);
                }
            }
        }
     
        public function attach(Skills $skill, $data = null) {
     
            parent::attach($skill, $data);
        }
     
        public function id() {
            return $this->_id_skill;
        }
    ...

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    En terme de design, il faut rester simple : si les compétences rattachées à un personnage ne se résument qu'à une simple liste alors il est préférable d'opter pour la gestion sous forme de tableau.

    Par contre, si les compétences sont plus complexes, comme par exemple l'activation d'une compétence désactive une autre compétence (voire plus compliqué encore) alors là tu dois gérer sous forme de classe.

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Je viens de voir ton ajout de code et j'ai mal pour toi : nommer une classe comme ça : Home_Model_DbTable_Game_Personnage ouch...
    Tu sais que depuis PHP 5.3, la gestion des espaces de nom est disponible.
    Ramené à ta problématique, je ferais quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    namespace NomDuJeu;
    namespace NomDuJeu\Personnage;
    namespace NomDuJeu\Personnage\Database; // accès aux donnée uniquement
    namespace NomDuJeu\Bataille; 
    // etc ...

  9. #9
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 107
    Points : 86
    Points
    86
    Par défaut
    En faite, c'est pas des classes, mais des models, et c'est sous zend, par défaut, la gestion des noms se fait comme ça, et ça me gène pas spécialement. (vu que je développe sous netbeans, je débute le nom, et il trouve directement le model, au moins l'arborescence me saute directement aux yeux)

    Ok pour le message précédent, mais quand tu dis, l'activation d'une compétence en désactive une autre, oui je trouve ça plus simple de manipuler un objet qu'un tableau, plus souple, en revanche, la désactivation/activation d'un skill par exemple se fait bien dans le model? (là où je range toutes mes fonctions)
    C'est là où j'hésite, à quel moment une fonctionnalité doit être complètement comprise dans la classe ou si elle reste dans le model?

    Car là, lorsque je vais utiliser un skill, je vais récupérer l'id du skill utiliser, allez chercher l'objet, puis utiliser la fonction correspondant à l'action enregistrer dans l'objet skill.

    Pour moi, tout ce qui est dans la classe ne sert qu'a construire l'objet, à modifier l'objet, mais dès qu'il s'agit de faire une action plus importante (qui inclus des recherches dans la base de donnée, ou d'une fonction du model, par exemple), je reste au niveau du model.
    Est ce que je ne me plante pas?

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    La classe Skill fait intégralement partie du modèle dans le MVC.
    Ton modèle est composé de classes (je ne vois pas ce que tu ne saisis pas).
    L'ensemble de ces classes dites "métier" permettent de gérer les règles de ton jeu.

    La partie contrôleur du MVC va gérer l'ensemble des moyens qui permettent d'attaquer le modèle (de l'extérieur). Le modèle n'est jamais exposé en direct.

    Enfin, la vue va permettre de gérer le rendu graphique plus ou moins morcelé afin de pouvoir gérer le modèle dans toute sa complexité. C'est la vue qui incorpore les appels vers les différents contrôleurs.

  11. #11
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 107
    Points : 86
    Points
    86
    Par défaut
    Bah justement je saisis pas bien, peut être du à un problème de vocabulaire, ..
    Mon modèle est composé de classes métier? ça je comprend pas, actuellement mon modèle est composé surtout de fonctions, certaines vont chercher des trucs dans la base de donnée, d'autres vont faire des calculs, et d'autres vont appeler des classes rangées dans ma librairie.
    Du coup, bah mes classes seules, gèrent pas grand chose, c'est le modèle qui possède toutes les fonctionnalités. (je parle dans mon cas, et els bouts de code que j'ai mis, j’interprète comme ça)
    Le modèle n'est jamais exposé en direct? je comprends pas.
    Soit je comprend mal, soit j'ai raté un truc?

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Simple : modèle = métier
    Donc ton modèle est principalement composé de classes métier.
    Toutes tes classes qui font des "trucs" relatifs à tes règles du jeu sont des classes métier et relèvent du MODEL dans le pattern MVC.

    Pour ce qui est de l'exposition, c'est encore simple : aucune requête en provenance d'un navigateur ne doit atteindre le métier sans passer par la case contrôleur.
    Le contrôleur s'assure que les paramètres d'appels sont corrects, décide quoi faire en fonction de ces derniers, appelle les classes métiers et/ou vues et renvoie la réponse en conséquence.
    Bref, normalement à chaque fonction de ton modèle tu peux faire correspondre une action gérée par un contrôleur.

    C'est plus clair ?

  13. #13
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 107
    Points : 86
    Points
    86
    Par défaut
    Ok, donc c'était vraiment un problème de vocabulaire car c'est ce que je fais. (sauf que, bêtise de ma part, j’appelais ça model)

    Donc merci beaucoup en tout cas, c'est bien plus clair

    J'essaierais de faire de l'uml également pour que ce soit plus clair, mais, moi qui voulait workbench ..

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/07/2009, 12h07
  2. Probleme d'apel de fonction dans une autre classe
    Par freecell31 dans le forum MFC
    Réponses: 24
    Dernier message: 13/05/2006, 11h34
  3. Appel de fonction dans une classe
    Par saint-pere dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2006, 22h13
  4. Appel de fonction dans une classe
    Par Seth77 dans le forum Langage
    Réponses: 8
    Dernier message: 16/01/2006, 10h32
  5. Réponses: 1
    Dernier message: 05/11/2004, 17h15

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