JeuWeb - Crée ton jeu par navigateur
Aide à l'apprentissage de la POO - 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 : Aide à l'apprentissage de la POO (/showthread.php?tid=6355)

Pages : 1 2 3 4


Aide à l'apprentissage de la POO - Damocorp - 26-08-2012

Salut,

Comme j'ai lu plusieurs fois que quand on est débutant, on a tendance à faire tout est n'importe quoi, j'aimerai votre avis.

Voici ma première classe après avoir lu un tutoriel sur la POO.
Le problème est la vérification des variables envoyées au serveur depuis le client. C'est un des points qui me bouffe du temps et surtout qui se répète de page en page. Je me suis donc dis que commencer la, serait surement une bonne chose.
Je sais que cette classe est inutile pour le moment, mais en rajoutant des méthodes pour le traitement des chaines de caractères, cela pourrait devenir intéressant.

Voici donc ma première classe :
[pastebin]u78a4pQy[/pastebin]

Ma page de test :
[pastebin]Wd6Tj53E[/pastebin]


Voici donc quelque chose de passionnant à étudier.
Bien qu'ici je ne pense pas que le code devienne plus lisible pour un exemple aussi simple, j'ai pu remarquer une chose plutôt sympa.

Et si demain je voulais travailler avec des chiffres négatifs ?
En procédurale, il me faudra un bon moment pour adapter le site.
En POO, il me suffirai de changer ma méthode.


Y'a-t-il des petites choses que je devrai directement corriger dans ma façon de voir et d'écrire en POO ?
Étant en plein dedans, autant apprendre et écrire correctement pour la suite.


RE: Aide à l'apprentissage de la POO - Sephi-Chan - 26-08-2012

C'est un exemple de mauvaise POO : tu as seulement encapsulé des fonctions dans une classe.
Tu n'utilises absolument aucune notion intéressante de l'objet.

Quelques points en vrac :
  • Le nom de ta classe Check_data ne suit aucune convention existante. En général, on utilise le CamelCaps pour le nom des classes. Ça donnerait donc CheckData (qui serait défini dans un fichier check_data.php).
  • check_number ne veut rien dire : on ne peut pas deviner le type de donnée que c'est supposé renvoyer ni dans quel cas (valide ou invalide) on doit recevoir true. Il faut plutôt appeler ça is_integer, is_positive_integer, etc.
  • On ne comprend pas pourquoi tu fais certaines tests. Pourquoi est-ce que check_number renvoie false si on lui donne un nombre négatif ? -3 est-il moins un nombre que 3 ?
  • Quel est l'intérêt de tes getter/setter ?

Typiquement, tu n'as aucun intérêt à faire de la POO ici : de simples fonctions suffisent, et ça te permet également de ne pas avoir à changer ton code partout si tu changes les règles de validation : tu ne changes que la fonction.

À mon sens c'est un très mauvais premier : c'est faire de l'objet pour faire de l'objet. L'OO est plus une démarche de conception d'une entité ou d'une interaction.

Pour imaginer des cas d'utilisations, il faut plutôt que tu nous parle de tes interactions. Là on pourra te faire des démonstrations plus concrètes d'utilisation de l'objet. Smile


RE: Aide à l'apprentissage de la POO - Damocorp - 28-08-2012

Merci pour tes remarques, j'ai été lire pas mal de choses et voila un peu ou j'en suis ( car mes recherches sur la POO m'ont appris d'autre trucs dont on m'as souvent parlé ici ) :

MVC : Voila quelque chose qui me plait et réponds à un besoin de clarifier tout ce bordel que devenait mon code. Je vais donc adopter cette façon de travailler et réorganiser mes fichiers.
Memecached et APC : Tout aussi intéressant, bizarre comme concept à prendre en main. Je démarrerai prochainement les tests, c'est déjà installer. Y'a plus qu'a !
Symfony : C'est super lourd et tout ce que j'ai fait avec m'as pas du tout convaincu de l'utilité d'un tel framework pour monter un jeu web. Par contre j'y voit très bien l'intérêt de la POO pour le développer. Cela standardise les choses pour la communauté ? c'est bien cela ?

Bon après moultes recherches je n'ai donc pas réussi à trouver un code qui pourrai avoir un intérêt POO plutôt qu'en procédural. Systématiquement, mes codes fonctionnent parfaitement en fonctions qui peuvent s'auto appeler. Quel intérêt donc de les développer en POO ?

Citation :Pour imaginer des cas d'utilisations, il faut plutôt que tu nous parle de tes interactions. Là on pourra te faire des démonstrations plus concrètes d'utilisation de l'objet.
Ok pour essayer de mieux comprendre je vais donc solliciter ton aide.

Voici un exemple d'interaction :

Je possède 20 vaisseaux. Chaque vaisseau possède :
  1. Une coque de base ( pour la construction )
  2. La coque de base actuelle du vaisseau ( donc le pt 1 + ou - le modification reçu lors d'autre actions )
  3. L'état actuelle de la coque ( le vaisseau est-il endommagé par exemple ? )
  4. Bouclier de base ( construction )
  5. Bouclier de base actuel ( donc après modification )
  6. État actuel du bouclier de base ( celui ci est entre 0 et X %, 100% du bouclier de base actuel n'étant pas forcement le max )
  7. Valeur d'attaque mini ( lors de la construction )
  8. Valeur d'attaque mini actuel ( après différent modificateur )
  9. Valeur d'attaque maxi ( lors de la construction )
  10. Valeur d'attaque maxi actuel ( après différent modificateur )
On ne gère donc pas une flotte au sens Vaisseau => quantité. Chaque vaisseau d'une flotte sont rarement identique sauf s'ils sortent de la construction ( et encore ça peut changer ).

Imaginons que le Joueur A envoi X vaisseaux contre le joueur B.
Le combat se déroule de cette façon :

* Je pars du principe que les vaisseaux sont plein propulseur, se déplaçant un maximum pour esquiver les tirs ennemis. Dans ce bordel, chaque vaisseau tir dès que ses armes sont chargées sur le premier vaisseau à porté *
Au niveau programmation je règle cela comme ceci :
- J'effectue 5 tours, donc chaque vaisseaux à 5 tirs possibles
- Chaque vaisseau tir sur un vaisseau ennemi choisi aléatoirement, voir aucun s'il n'en as pas à porté
- si un vaisseau est détruit, forcement il ne tir plus. Et disparait complètement ( la gestion du temps de mourir n'est pas pris en compte )
- Chaque vaisseau effectue des dégâts qui sont réduits par l'état moyen dans lequel il se trouve.



La POO est-elle approprié pour gérer le combat que j'effectue en 5 tour cela ?
Car pour le moment ma fonction le fait très bien et je vois pas ce que va m'apporter la POO.





Tout ce que j'ai trouvé parle de POO. Mais j'ai pas encore réussi à trouver une seule explication qui expliquerai pourquoi on fait cela en POO plutôt qu'avec des fonctions et en procédurale.
J'ai vraiment l'impression d'être confronté à un effet de mode...


Je continue de lire tout ce que je trouve sur la POO, donc mes idées et avis vont certainement évolué et changer d'ici peu de temps.


RE: Aide à l'apprentissage de la POO - Akira777 - 28-08-2012

Hum, la question n'est pas forcément : "Est-ce que la POO est appropriée ici ?". Tout va dépendre de ton code et de ton projet.

Dans ce cas, tu peux voir une classe abstraite pour gérer tes vaisseaux.
En prenant un exemple à la con : Imaginons que tu pourrais avoir des vaisseaux mécaniciens (qui vont réparer les autres vaisseaux de ta flotte), des vaisseaux de défense (qui vont apporter un bouclier d'énergie à l'ensemble de tes vaisseaux), des vaisseaux d'attaque, ...

De là, tu as une classe abstraite qui regroupe les fonctions communes à tout tes vaisseaux.

- abstract class Vaisseau {}

Ensuite, tu as une classe pour chaque spécialisation des vaisseaux qui vont étendre de la classe principale :

- class VaisseauMecanic extends Vaisseau {}
- class VaisseauDefense extends Vaisseau {}
- class VaisseauOffense extends Vaisseau {}

Ces classes apportent par une surcharge des comportement spéciaux pour chacun des vaisseaux. A partir de là, quand tu vas engager ton script de combat, via une classe :

- class Fight {} (pas très original)

Une classe spécifique peut aller se charger de récupérer les données des deux flottes, et retourner pour chacun des vaisseaux de la flotte un objet correspondant à sa classe particulière (VaisseauMecanic, VaisseauDefense, ...).

Quand tu fais ton combat en 5 tours, tu n'as plus qu'à boucler par exemple et faire les actions spécifiques à chaque vaisseau.

Après c'est peut-être pas la meilleure solution pour résoudre ton problème, parce que je ne connais pas tes attentes pour ton exemple. Mais dans l'ensemble c'est à mes yeux une utilisation "correcte" de la POO.


RE: Aide à l'apprentissage de la POO - Thêta Tau Tau - 28-08-2012

(28-08-2012, 02:00 PM)Damocorp a écrit : Tout ce que j'ai trouvé parle de POO. Mais j'ai pas encore réussi à trouver une seule explication qui expliquerai pourquoi on fait cela en POO plutôt qu'avec des fonctions et en procédurale.
J'ai vraiment l'impression d'être confronté à un effet de mode...

Tu ne vois la POO que comme un moyen d'empaqueter des fonctions, c'est parfois le cas, ça permet déjà d'organiser un peu le code, mais ce n'est pas là l'utilité de la POO.

L'exemple le plus frappant pour moi, ce sont les classes "Model" des framework.

Par exemple (avec django) :
class New(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField()
author = models.ForeignKey(User)
content = models.TextField()

A partir de la, vu que la classe hérite de Model, le framework peut en faire beaucoup de choses :
  • Créer la table correspondante en bdd
  • Charger des données depuis la bdd sans passer par la SQL
  • Sauvegarder dans la bdd
  • Ajouter à l'administration du site une liste des news, un formulaire pour en créer, les éditer, les supprimer etc.
  • En utilisant des contrôleurs "tout fait", on peu facilement afficher (par exemple), la liste des 5 dernières news par date de publication décroissante. Le tout en une seule ligne de code + le template.



RE: Aide à l'apprentissage de la POO - Damocorp - 28-08-2012

Je mets du temps à répondre mais je lis vos réponses. C'est juste que je lis un max pour être sûr de pas me planter dans ma réponse.
Pour le moment, le seul côté que je trouve bien en POO comparer au procédural c'est le principe d'héritage.

Une nouvelle question donc :
Si je fais une classe ( abstraite donc ? ) qui joue uniquement sur l'héritage pour fonctionner. Est-ce la un pas vers de la "POO correcte" ?


RE: Aide à l'apprentissage de la POO - niahoo - 28-08-2012

(28-08-2012, 03:21 PM)Thêta Tau Tau a écrit :
(28-08-2012, 02:00 PM)Damocorp a écrit : Tout ce que j'ai trouvé parle de POO. Mais j'ai pas encore réussi à trouver une seule explication qui expliquerai pourquoi on fait cela en POO plutôt qu'avec des fonctions et en procédurale.
J'ai vraiment l'impression d'être confronté à un effet de mode...

Tu ne vois la POO que comme un moyen d'empaqueter des fonctions, c'est parfois le cas, ça permet déjà d'organiser un peu le code, mais ce n'est pas là l'utilité de la POO.

L'exemple le plus frappant pour moi, ce sont les classes "Model" des framework.

Par exemple (avec django) :
class New(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField()
author = models.ForeignKey(User)
content = models.TextField()

A partir de la, vu que la classe hérite de Model, le framework peut en faire beaucoup de choses :
  • Créer la table correspondante en bdd
  • Charger des données depuis la bdd sans passer par la SQL
  • Sauvegarder dans la bdd
  • Ajouter à l'administration du site une liste des news, un formulaire pour en créer, les éditer, les supprimer etc.
  • En utilisant des contrôleurs "tout fait", on peu facilement afficher (par exemple), la liste des 5 dernières news par date de publication décroissante. Le tout en une seule ligne de code + le template.

Ouais en même temps tu peux faire parfaitement la même chose avec un foutu array ou des tuples ou des types construits, des struct, des property-list, des dictionnaires …


RE: Aide à l'apprentissage de la POO - Ter Rowan - 28-08-2012

(28-08-2012, 04:11 PM)Damocorp a écrit : Une nouvelle question donc :
Si je fais une classe ( abstraite donc ? ) qui joue uniquement sur l'héritage pour fonctionner. Est-ce la un pas vers de la "POO correcte" ?
l'héritage est un pan de la poo (donc si tu commences à imaginer un système de classes qui héritent les unes des autres, tu touches un intéret de la poo

La notion de classe abstraite n'est pas systématique. En trait grossier une classe abstraite est une classe dont aucun objet ne peut être l'instance "directe"

ex :

avec abstract class Vaisseau {}

tu ne peux pas créer :

$monVaisseau = new Vaisseau;


par contre tu pourrais très bien imaginer une classe "normale" vaisseau qui a ses comportements standards et dans ce cas peut être instanciée (par le $monVaisseau)

il n'y a pas de bijection :

on peut avoir de l'héritage sans classe abstraite
on ne peut pas avoir de classe abstraite sans héritage (ou plus exactement, sans héritage, une classe abstraite ne sert à rien)


mais encore une fois ce n'est pas que par l'héritage qu'on fait de l'oo

regarde aussi du coté des pattern. Essaie singleton, et strategy, c'est assez simple à comprendre et à mesurer l'intéret de l oo


RE: Aide à l'apprentissage de la POO - Sephi-Chan - 28-08-2012

La POO ne permet pas de faire plus de chose que la programmation procédurale : ça permet seulement de le faire différemment.

Peux-tu nous montrer ton script d'inscription (la partie qui créer l'utilisateur) ? Ça nous permettra de te montrer là où tu pourras y gagner.

Les frameworks (pour les langages que tu utilises) sont écrits en objet, donc tu dois y passer si tu veux en profiter (et crois moi, tu aurais tort de t'en priver).

Je te conseille d'essayer un framework comme CakePHP, Laravel ou Symfony. Ne fait surtout pas ton MVC maison : ça va être nul. Laisse le framework te guider un peu pour faire tes premiers pas dans ce monde de l'objet. Smile


RE: Aide à l'apprentissage de la POO - Damocorp - 28-08-2012

Partant du principe que je n'ai pas un niveau suffisant pour m'assurer un bon niveau de sécurité, j'ai pour habitude de ne pas partager mes scripts. Ainsi moins de gens en savent, moins j'ai de chance d'avoir des problèmes sur une conneries que j'aurai pu faire. Et mes conneries je les corrigent quand je les voit arrivaient chez d'autres qui se plaignent sur le net.

Symfony je suis en plein tests. Et pour le moment, c'est juste décevant concernant le temps de chargement, 2843 ms pour un hello world mis en paramètre dans l'url ( suivi de 2xx une fois en cache ), ça fait peur... Mais bon j'en suis qu'au tout début, j'dois faire beaucoup plus de tests.

Voici un vieux code pour un jeu que j'ai jamais sorti sur le net. L'inscription contenait deux fois rien mais le principe reste quasi le même.
[pastebin]K43sfgBD[/pastebin]
- inclusion
- Vérification
- Insertion BDD
- redirection
Rien de très poussé.
Je sais que les commentaires sont inutiles, pour vous en tout cas. C'est une habitude chez moi qui me permet de faire défiler le défilement vertical très vite dans mes longs scripts, et d'accéder à ce que je souhaite très rapidement.