Partage
  • Partager sur Facebook
  • Partager sur Twitter

En objet, comment on fait?

petit problème de concept

    15 novembre 2007 à 1:35:26

    Bon alors voilà. J'ai décidément un peu de mal à me faire au concept de l'orienté objet, malgrès le fait que je trouve celui-ci très pratique. Mon problème est que j'ai un peu de mal à voir de manière clair comment obtenir de la manière la plus simple ce que je veux. C'est pourquoi je viens vous demander conseil (pour ne rien vous cacher -et de toute façon ça va se voir- je suis beaucoup plus habitué à programmer en C).

    J'ai un petit programme SDL pour lequel je crée un personnage, qui posséde des caractèriques, et qui contient un certains nombres d'animation. Pour représenter ça en C, je fais :

    1. struct s_perso {
    2. int x; //position en x
    3. int y; //position en y
    4. int nbreAnim; //le nombre d'animation
    5. struct s_anim *anim; //un tableau de structure à allouer
    6. };
    7. struct s_anim {
    8. int animActu; //numéro de l'animation
    9. int animEnPause;
    10. };


    Bon j'ai pas tout mis, c'est juste pour montrer mon principe. Maintenant, je voudrais retranscrire ça en C++ (étant donné que je suis en train de réécrire tout mon petit jeu en C++ en guise d'exercice). C'est assez dur car il faut que je fasse abstraction de la façon dont je m'y suis pris en C, car en C++, ça nous donne pas du tout la même chose (logique).

    Et mon problème, c'est qu'à force de refléchir au problème, je m'emmêle les pinceaux.J'en arrive donc à quelque chose comme ca:

    1. class Perso {
    2. private:
    3. int x;
    4. int y;
    5. int nbreAnim;
    6. vector<Anim> anim;
    7. public:
    8. Perso();
    9. ~Perso();
    10. };
    11. class Anim {
    12. private:
    13. int animActu;
    14. int animEnPause;
    15. //d'autres attributs
    16. public:
    17. Anim();
    18. ~Anim();
    19. //Plein d'accesseurs pour que ma classe Perso puisse avoir les informations
    20. };


    Et ce qui me dérange, c'est le fait de me retrouver avec dans mes classes une grosse quantité d'accesseurs. Sans compter le fait que je présente ici un modéle réduit, car en réalité pour chacune des animations, j'ai aussi un tableau vers une autre class Frame qui sert à indiquer les coordonnées de chaque animation sur mon charset utilisé.

    Ma méthode est-elle correct ou je ferais mieux de me contenter de rester sur le C?

    PS: si jamais vous vous demandez pourquoi je fais du C++ alors que je suis très bien capable de faire ce que je veux en C, c'est une bonne question. Si je le fais, c'est parce que le principe d'objet m'intéresse beaucoup (et m'intrigue en même temps vu que je n'y suis pas du tout habitué) et j'aimerais y avoir plus clair, donc ça me sert d'exercice comme je l'ai dit plus haut).

    Merci d'avance à tout ceux qui répondront (et même ceux qui répondent pas mais qui aurait eu le courage de me lire (surtout que j'ai peut-être écrit des atrocités en C++))
    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2007 à 4:02:00

      Citation : Pas de titre

      Ma méthode est-elle correct ou je ferais mieux de me contenter de rester sur le C?


      oui, ta méthode semble correct.

      après, bah au lieu d'avoir deux accesseur comme ceci dans Perso :

      1. void setX(int n);
      2. void setY(int n);


      il suffit de les mettre ensemble de manière logique, comme ca :

      1. void setPosition(int x,int y);


      (m'enfin, je crois pas t'apprendre des trucs nouveaux :-° non? :lol: )

      ... Disons que plus la classe est complexe (ex: une classe représentant un moteur de jeu), plus la méthode "orienté Objets" devient utile, voir indispensable. Surtout avec des concepts "un brin" plus "avancé" tel que l'héritage et la surcharge d'opérateurs (montrés dans le tuto de notre cher mateo), ce qui n'est pas vraiment possible avec de simple structs...
      • Partager sur Facebook
      • Partager sur Twitter
      Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
        15 novembre 2007 à 5:16:51

        Merci pour cette réponse matinale. J'essaye en effet d'utiliser une classe pour faire un moteur de jeu (j'ai vu ça sur developpez, c'est notamment à cause de ça que je découvre le côté pratique des objets qui rendent vraiment le code plus limpide), et pour le moment il semblerai que je m'en sortes à peu près. Y'a peut-être des trucs qui plairait pas à des habitués du C++ , mais le principal est que ça marche(pour le moment). Je commence à me faire à l'idée de voir les choses comme des objets.

        Mon gros problème réside plutôt dans la façon de les imbriquer les uns avec les autres maintenant (accesseurs trop nombreux, classes trop nombreuses). Je me rends jamais compte de si mon code est mal tourné ou bien tourné! Mais bon, vu la communauté du site du zéro, en cas de chose pas clair, suffit de demander!

        Et pour l'idée :

        Citation : shadosan

        il suffit de les mettre ensemble de manière logique, comme ca :

        1. void setPosition(int x,int y);


        Bah, aussi simple que ça puisse être, j'y avais même pas penser. Je suis ridicule sur ce coup là. :o
        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2007 à 14:22:33

          Mettre des mutateurs n'est pas plus objet. Ici, c'est plus de l'abus qu'autre chose.
          Pour faire, vraiment, plus objet, définis une classe Position, une Distance/Ecart/Deplacement/..., et définis tous les opérateurs qui vont bien dans le cadre de l'arithmétique qui leur va bien.

          Après, tu pourras définir des moveTo(Position), move(Deplacement), ... qui s'occuperont de vérifier les contraintes de positionnement dans ton monde.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            15 novembre 2007 à 16:33:43

            Citation : Vanger

            Et ce qui me dérange, c'est le fait de me retrouver avec dans mes classes une grosse quantité d'accesseurs.



            Bravo! c'est le premier pas vers la POO et c'est dans une très bonne direction! La POO t'intéresse et ça se voit : tu te poses des questions! ;)

            Écoute lmghs : c'est le guru! (comparés au zér0 moyen, c'est un guru :p )

            Lâches pas, tu es sur une très bonne voie!
            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2007 à 16:43:03

              Citation : Mattex

              Lâches pas, tu es sur une très bonne voie!



              Merci c'est encourageant!

              @lmghs: j'ai un peu de mal à comprendre! En fait, je garde ma classe Perso, mais plutôt que d'avoir beaucoup d'attributs, je crée d'autre class pour définir ma Position, mon Déplacement, etc. J'espère avoir compris correctement, j'vais faire des essais. En tout cas merci pour les réponses!
              • Partager sur Facebook
              • Partager sur Twitter
                16 novembre 2007 à 12:11:59

                Citation : MatteX

                Citation : Vanger

                Et ce qui me dérange, c'est le fait de me retrouver avec dans mes classes une grosse quantité d'accesseurs.


                L'abus d'accesseurs est effectivement mauvais pour la santé... Et contrairement à ce que certains disent, cela n'a rien d'OO. La pierre fondatrice de l'OO et des bons designs, c'est l'abstraction. L'encapsulation n'est que le moyen d'y parvenir. Un accesseur (/mutateur) n'est pas fait pour être utilisé comme décapsuleur qui expose les détails de fonctionnement.
                Tu as quelques discusions à ce sujet dans la FAQ C++ de developpez.

                Citation : MatteX

                Écoute lmghs : c'est le guru! (comparés au zér0 moyen, c'est un guru :p )


                wanabe. Juste un wanabe guru, j'ai encore du chemin à faire.

                Citation : Vanger

                @lmghs: j'ai un peu de mal à comprendre! En fait, je garde ma classe Perso, mais plutôt que d'avoir beaucoup d'attributs, je crée d'autre class pour définir ma Position, mon Déplacement, etc. J'espère avoir compris correctement, j'vais faire des essais. En tout cas merci pour les réponses!


                C'est l'idée. Délègue à des classes aux responsabilités mieux ciblées.
                • Partager sur Facebook
                • Partager sur Twitter
                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                  16 novembre 2007 à 14:55:22

                  D'accord. L'idée commence à rentrer, par contre je ne savais pas que les accesseurs étaient une mauvaise chose, donc pour être franc j'en utilises pas mal car justement, la liaison entre mes classes laisse à désirer et que j'aurai pu faire plus de classes pour mieux les cibler.

                  Je vais déjà aller lire la FAQ comme tu me l'as suggeré (merci pour le lien dans la signature). Et ensuite, un petit tour du côté de mon code car quelques modifications s'impose et y'a du boulot!
                  • Partager sur Facebook
                  • Partager sur Twitter

                  En objet, comment on fait?

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown