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 !!!
;-)
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.
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.)
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.
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 ?
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... !!!
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 ?
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...
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.
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();
}
?>
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... ?
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.
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 !
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.
https://anthonypauwels.be/
https://anthonypauwels.be/