Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment bien penser son application POO ?

Sujet résolu
    3 janvier 2013 à 17:05:20

    bonjour à vous,

    En plein apprentissage de la POO, je cherche à bien comprendre comment bien "architecturer" ou conceptualiser une application avant de foncer tête baissée dans les développements et se tromper...

    pour ça, j'ai créé un mini jeu de course de voitures :
    il y a 2 types de voitures 'berline' et 'sportive'. Pour chaque voiture le jeu va consister à calculer son temps de course (grâce entre autre à la méthode function calculTpscourse() qui sera différente selon si c'est une berline ou sportive ==> heu oui... en fait j'ai intégré une notion de nitro pour les sportives histoire de compliquer un peu... bref!)

    Ce temps de course est calculé à partir d'une distance que l'on saisie dans un formulaire.
    les données sont stockées dans une base de données. (marque de voiture, type, temps de course)

    Fonctionnement de l'application: quand on saisit une distance dans un formulaire, après envoi apparaît une liste de voitures avec leur temps de course

    question:
    Sachant que la fonction calculTpscourse est différente pour les 2 types de voitures:
    quelle est la meilleure conceptualisation du fonctionnement de mon application ?

    faut-il par exemple:
    - une interface Voiture (abstraite et avec la méthode calculTpscourse)
    - une classe VoitureManager pour la récupération et l'écriture des données dans la base de données
    - une classe Berline implements Voiture avec réécriture de la méthode calculTpscourse
    - une classe sportive implements Voiture avec réécriture de la méthode calculTpscourse
    - et un fichier index.php avec le formulaire et l'affichage des résultats

    ou faut-il éviter une interface mais juste créer une classe mère Voiture (gérant les berlines) et une classe fille Sportive où seule la méthode calculTpscourse serait réécrite ?

    autre plus judicieux ??

    autre question: quelles différences entre interface, classe abstraite et trait ?



    en espérant être le plus clair possible...
    merci pour ceux qui auront le courage d'éclairer ma lanterne !!!
    ;-)
    • Partager sur Facebook
    • Partager sur Twitter
      3 janvier 2013 à 17:16:28

      Salut,

      Le plus simple c'est de commencer par créer une classe mère Voiture, que tu feras hériter par Berline et Sportive. Tu mets dans Voiture le maximum de choses, pour ne venir modifier que les quelques cas particuliers depuis Sportive (ou Berline).

      Tu n'as pas forcément besoin d'interface si tu n'as pas tout un système d'injection.
      • Partager sur Facebook
      • Partager sur Twitter
        3 janvier 2013 à 17:17:21

        perso je dirais que le type de voiture (berline ou sportive) est simplement un attribut de la classe voiture, donc pas besoin d'héritage entre plusieurs classes, tu crées simplement une classe voiture avec un attribut type et un autre attribut nitro.

        Pour la méthode calculTpsCourse, je dirais qu'on pourrait imaginer que cela répond à la question "que fait mon objet Voiture ?", et donc on peut répondre qu'il parcourt le circuit dans un certain laps de temps, et donc je mettrais bien cette méthode directement dans la classe voiture aussi. Ca n'a pas vocation à gérer l'objet Voiture (et donc n'a pas à être dans une classe VoitureManager.)

        Ce n'est que mon humble avis. :)
        • Partager sur Facebook
        • Partager sur Twitter
          3 janvier 2013 à 17:26:49

          Non ici le type de voiture n'est pas simplement un attribut. Le type de voiture change le comportement de celle-ci, et donc le calcul du temps de parcours : c'est clairement un héritage qu'il faut ici.
          • Partager sur Facebook
          • Partager sur Twitter
            3 janvier 2013 à 18:40:37

            Merci à vous,

            Je vais donc essayer un classe mère Voiture et 2 classes filles.
            je conserve un VoitureManager pour la relation avec la bdd ?
            Merci ;-)
            • Partager sur Facebook
            • Partager sur Twitter
              3 janvier 2013 à 19:07:54

              Citation : winzou

              Non ici le type de voiture n'est pas simplement un attribut. Le type de voiture change le comportement de celle-ci, et donc le calcul du temps de parcours : c'est clairement un héritage qu'il faut ici.


              Moi je le vois plutôt comme un attribut qui est passé en paramètre dans la méthode calculTpsCourse(). Sinon tu vas déclarer une méthode calculTpsCourse() dans chaque classe fille ?
              • Partager sur Facebook
              • Partager sur Twitter
                3 janvier 2013 à 19:11:47

                C'est ce qu'on appel une méthode abstraite.
                • Partager sur Facebook
                • Partager sur Twitter
                  4 janvier 2013 à 16:29:20

                  j'ai suivi conseil de winzou en implémentant comme suit:
                  abstract class Voiture
                  class Berline extends Voiture
                  class Sportive extends Voiture

                  j'ai en fait implémenté de la même façon que dans le TP sur les personnages page 88 du tuto de vyk12 sur la POO en php

                  mais j'ai un soucis:
                  j'utilise une session, non pas pour restaurer un objet mais pour éviter que l'on puisse faire f5 et recharger la page avec une nouveau calcul automatique, bref:
                  quand je mets session_start(); just après la pile d'autoload dans le fichier index.php, j'ai une erreur fafale : Cannot instantiate abstract class Voiture juste à la ligne de mon ouverture de session !!

                  si j'enlève session_start(); alors mon application de course fonctionne correctement.
                  Je ne comprends pas vraiment car j'ai beau chercher, je ne trouve nul part où j'instancie ma classe Voiture (qui est abstraite de toute façon)
                  et en plus dans le TP du vyk12, ça marche... !!!

                  quelqu'un peut m'aider ??
                  Merci à vous ;-)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 janvier 2013 à 16:41:11

                    Salut, étrange ton souci...

                    Quand tu dis "j'ai beau chercher", tu cherches à la main?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Vous utilisez git et (Composer, Sismo, Symfony ou ctags)? Simplifiez vous la vie avec des hooks!
                      4 janvier 2013 à 16:47:16

                      Ne cherche pas à la main. Tu risques d'en oublier. Si tu es sous linux, tu peux utiliser ack-grep pour ça.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Vous utilisez git et (Composer, Sismo, Symfony ou ctags)? Simplifiez vous la vie avec des hooks!
                        4 janvier 2013 à 16:57:42

                        Dommage.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Vous utilisez git et (Composer, Sismo, Symfony ou ctags)? Simplifiez vous la vie avec des hooks!
                          4 janvier 2013 à 17:10:01

                          pas d'autre alternative ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 janvier 2013 à 17:11:02

                            Si bien sûr, il doit y en avoir un milliard ou deux. Cherche.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Vous utilisez git et (Composer, Sismo, Symfony ou ctags)? Simplifiez vous la vie avec des hooks!
                              4 janvier 2013 à 17:56:07

                              TU veux dire que tu as une instance de Berline et que ta session te ressort que tu as une instance de voiture ?

                              - Si c est le cas, c est un sacré soucis pour le polymorphisme en POO et j'étais pas au courrant xD
                              - Si tu as instancié un objet voiture, sache que ca n'est pas possible (c est une classe abstraite -> pas d'instance !)

                              Après je ne connais pas ton niveau en PHP ni en POO, tu peux nous donner un bout de ton code ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 janvier 2013 à 12:33:51

                                Bonjour, Oui je débute en PHP orienté Objet. J'apprends grâce au tuto de Vyk12 mais j'essaie de créer mes propres exercices pour m'obliger à bien comprendre...

                                je vous joint les fichiers de mon application :
                                http://m.merlin.free.fr/Course-voitures.zip

                                Tu verras que dans le fichier index, j'ai du mettre en commentaire mon session_start()

                                Merci de ton aide. :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  5 janvier 2013 à 15:16:51

                                  Citation : IchabOd

                                  perso je dirais que le type de voiture (berline ou sportive) est simplement un attribut de la classe voiture, donc pas besoin d'héritage entre plusieurs classes, tu crées simplement une classe voiture avec un attribut type et un autre attribut nitro.

                                  Pour la méthode calculTpsCourse, je dirais qu'on pourrait imaginer que cela répond à la question "que fait mon objet Voiture ?", et donc on peut répondre qu'il parcourt le circuit dans un certain laps de temps, et donc je mettrais bien cette méthode directement dans la classe voiture aussi. Ca n'a pas vocation à gérer l'objet Voiture (et donc n'a pas à être dans une classe VoitureManager.)

                                  Ce n'est que mon humble avis. :)


                                  Citation : IchabOd

                                  Citation : winzou

                                  Non ici le type de voiture n'est pas simplement un attribut. Le type de voiture change le comportement de celle-ci, et donc le calcul du temps de parcours : c'est clairement un héritage qu'il faut ici.


                                  Moi je le vois plutôt comme un attribut qui est passé en paramètre dans la méthode calculTpsCourse(). Sinon tu vas déclarer une méthode calculTpsCourse() dans chaque classe fille ?



                                  Tu seras obliger de faire une condition dans la méthode calculTpsCourse() suivant le type de voiture pour calculer le temps de course qui correspond.
                                  Et là un problème se posera quand tu voudras ajouter d'autres types de voiture (ou même d'autres véhicules), tu seras obliger d'ajouter un nouveau bloc de condition et ainsi de suite pour chacune d'entre-elle.

                                  Alors qu'avec de l'héritage tu crées une nouvelle classe qui étend Voiture (qui pourrait même étendre une classe Vehicule pour les motos, camions, etc.) et tu réécris la méthode calculTpsCourse() dans celle-ci.

                                  Au final, ton code sera plus facilement maintenable car ta seule préoccupation sera d'instancier les classes que tu veux.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 janvier 2013 à 11:06:06

                                    Oui mais cela ne résolve pas mon pb de session...
                                    merci
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 janvier 2013 à 11:24:20

                                      c'est pas mal, par contre pour ta class Voiture je ne comprend pas pourquoi elle est fille de la class DateTime ?

                                      <?php
                                          abstract class Voiture extends DateTime
                                      ?>
                                      


                                      ensuite fait gaffe, le return met fin à l'execution d'une fonction, si tu met qqch après, çà ne sera pas exécuter :

                                      <?php
                                      public function getListe()
                                      {
                                          // ...
                                          return $voitures;
                                      
                                      /************************ FIN ************************/
                                      
                                          // plus rien n'est éxécuter
                                          $req->closeCursor();
                                      }
                                      ?>
                                      
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 janvier 2013 à 18:03:41

                                        en fait la classe DateTime me permet d'additionner 2 temps et donc d'avoir un cumul de temps de course (les attributs d'une voiture sont: marque, type, vitesse, tpscourse, cumultpscourse)

                                        pour la function getListe(), je pense qu'il n'y a rien après le return, sinon je l'enlèverai.

                                        pour la session, je ne comprends toujours pas pourquoi il me met une erreur fatale... ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          6 janvier 2013 à 19:13:04

                                          Citation

                                          en fait la classe DateTime me permet d'additionner 2 temps et donc d'avoir un cumul de temps de course (les attributs d'une voiture sont: marque, type, vitesse, tpscourse, cumultpscourse)


                                          Dans ce cas c'est ton champ tpsCourse qui est de type DateTime ou tout autre champs qui représenterait une date et heure.
                                          La classe Voiture ne doit pas étendre DateTime, ça n'a pas de sens ici.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            6 janvier 2013 à 19:21:36

                                            Oui, n'utilise pas l'héritage pour avoir accès à des méthodes d'une classe, instancie là directement dans la méthode concernée. ;)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              7 janvier 2013 à 10:12:30

                                              Effectivement, j'ai supprimé l'héritage de DateTime et je l'ai directement instanciée dans mes méthodes. Ça fonctionne bien.

                                              Même mieux: je me suis rendu compte que ma session fonctionne maintenant... surprenant non ??

                                              je n'ai pas tout compris, mais bon, je suis content que ma petite application fonctionne correctement !!! je vais pouvoir continuer mon apprentissage :p

                                              Merci à vous en tout cas et bravo pour vos tutos qui sont d'une qualité pédagogique exceptionnelle !
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 décembre 2014 à 1:38:37

                                                Bon quelques  mois ont passé mais je pense avoir trouvé la solution a ton problème:

                                                Tu as du , en suivant le tuto, testé ton code en créant une session avec l'objet voiture, mais tu as du oublier de te déconnecter avant de modifier ton code et changer ta classe voiture en classe abstraite.

                                                Du coup ta session qui existe toujours te renvoi ce message d'erreur.

                                                Il fallait donc te déconnecter ou supprimer le cache de ton navigateur pour supprimer la session en cours.

                                                Ca m'a fait le coup avec l'exercice du tuto il y a 5 minutes et je suis tombé sur ce post alors si d'autres cherchent la solution...

                                                C'est le fait que tu mentionnes que le fait de commenter session_start modifiait le comportement qui m'a mis la puce à l'oreille alors.......MERCI ! :)

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                comment bien penser son application POO ?

                                                × 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