JeuWeb - Crée ton jeu par navigateur
[Résolu] Comment coder proprement ? - 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 : [Résolu] Comment coder proprement ? (/showthread.php?tid=2381)

Pages : 1 2 3 4 5


RE: Aide pour coder "pro"^^ - Ziliev - 06-02-2008

C'est moi ou POO et "réponse simple" sont incompatibles Tongue On est passé de 30 pages à 10, certes y a progrès (et je te remercie du temps passé à nous pondre ce pavé, c'est pas dit méchamment du tout ^^). Par contre 'faudra m'excuser d'avoir survolé, j'compte dormir un peu cette nuit Confusediffle:

Les fonctions oui, je connais et j'aime. 'sur que quand t'as un paragraphe de ton code qui revient plusieurs fois dans ta page t'es heureux de faire une fonction. J'en ai par exemple une très efficace pour mes requêtes SQL qui permet d'afficher le message d'erreur, logger l'erreur (avec le numéro de ligne, ce qui est vraiment pratique), m'envoyer un mail et me faire un p'tit café avec un simple "or function()" au lieu du traditionnel "or die(mysql_error)".

Maintenant la différence entre la classe et la fonction ? Parce que bon de mon altitude de croisière là haut au dessus des nuages j'ai vu que grosso modo c'était à peu près équivalent dans tes exemples, t'avais un truc qui revenait souvent que tu simplifiait en envoyant chercher un bout de code mis de coté.


RE: Aide pour coder "pro"^^ - pascal - 06-02-2008

au niveau des régles simples :
_ si le code n'est exécuté qu'une seule fois, mais fait beaucoup de lignes, alors on peut le mettre dans une fonction. un code ça veut dire une unité dans ce qu'on fait. ex : vérifier les données d'un formulaire de 10 champs, c'est long, répétitif et peu intéressant au milieu d'une page. verifierDonnees(); est plus cool Smile
_ si le code risque d'être modifié un jour, alors on le met dans une fonction
_ si plusieurs fonctions utilisent les mêmes paramètres, les mêmes données, alors on peut les regrouper dans une classe

A+

Pascal


RE: Aide pour coder "pro"^^ - Ziliev - 06-02-2008




RE: Aide pour coder "pro"^^ - Zamentur - 06-02-2008

Ziliev a écrit :C'est moi ou POO et "réponse simple" sont incompatibles Tongue On est passé de 30 pages à 10, certes y a progrès (et je te remercie du temps passé à nous pondre ce pavé, c'est pas dit méchamment du tout ^^). Par contre 'faudra m'excuser d'avoir survolé, j'compte dormir un peu cette nuit Confusediffle:

Bon en fait au départ je répondait au premier message, et personne n'avais rien dit sur le fait d'écrire un trucs long Smile.
La demande initial était de voir concrètement pourquoi coder en fonction et en POO.

Et bien dans mon message tu as une réponse concrète mais effectivement longue car faisant état des conclusions de 3 ans de développement!

Et comme je le dis dans l'edit les autres ont synthétiser les raisons, comme on le fait toujours en sur les sujet POO (mais comme la demande était assez spécifique j'ai répondue)

D'ailleurs pascaltje a fait apparaitre dans son message précédent un élément de réponse que j'ai pas mis, car j'ai pas encore eu de cas similaire ou peut être que je le fais intuitivement?

Ah un moment donner faut admettre que tout ne peux pas venir comme çà sans rien faire aussi! C'est pas facile d'expliquer tout çà lol


RE: Aide pour coder "pro"^^ - Kassak - 06-02-2008

Zamentur, c'est exactement ce que je fais ou j'essaye de faire depuis un moment, évitez de faire du bête copié collé sur 50pages, pour qu'en suite on passe 1 heure a tout modifier car on a oublié un ";" ^^

Bref, j'ai réussi à passer d'une page qui faisait 1500 lignes voir+, a une page qui fait 5 lignes, avec dedans 5 includes.

Je pense que classe/fonction, ça revient à faire pareil, ainsi une fois la fonction par exemple attaque de faites, on a juste a l'apeller, comme on appelle un include, je me trompe pas?

Mais mon problème à moi, c'est que je pige pas comment créer une bonne fonction à partir de ce que j'ai déja, pour ça que j'ia demandé si une âme charitable voudrez bien passer une petite heure en ma compagnie afin qu'on passe mon script d'attaque codé a la porcasse, en un script façon POO, avec appelle de fonction etc...


RE: Aide pour coder "pro"^^ - Ziliev - 06-02-2008

pascaltje a écrit :au niveau des régles simples :
_ si le code n'est exécuté qu'une seule fois, mais fait beaucoup de lignes, alors on peut le mettre dans une fonction. un code ça veut dire une unité dans ce qu'on fait. ex : vérifier les données d'un formulaire de 10 champs, c'est long, répétitif et peu intéressant au milieu d'une page. verifierDonnees(); est plus cool Smile
_ si le code risque d'être modifié un jour, alors on le met dans une fonction
Euh personellement pour un éxécuté une fois je vois aps l'intérêt de faire une fonction ... 'faut dire aussi que je suis plutôt maniaque donc mes gros scripts sont séparés par des commentaires bien mis en valeur par la coloration de mon notepad++ fétiche. Pour vous donner une xemple une grosse page en général y a un bloc "initialisation", un "action" pour les résolutions d'actions diverses et variées (avec une action par sous-section, vu qu'il y a plusieurs facon de mettre des commentaires y a moyen d'avoir plusieurs couleurs de séparateurs ^^), un "affichage" pour la génération de la page à partir des données, et un "pied de page" pour fermer ce qui doit l'être et echo ce qui doit l'être aussi.

Après que tu délocalises ton fourbi du corp du code vers les fonctions ca fait que déplacer le problème hein ... Au lieu d'avoir un gros corp t'aura 15 écrans de fonctions et tu t'y retrouvera toujours aussi mal. T'as juste la séparation par les accolades de fonction, et maintenant que j'y pense les variables locales qui sont quand même plus agréables (parce que bon avec un gros corp tu commences à tomber un peu en panne de variables temporaires ^^).

pascaltje a écrit :_ si plusieurs fonctions utilisent les mêmes paramètres, les mêmes données, alors on peut les regrouper dans une classe

A+

Pascal

Et ca là ... J'ai pas compris ^^


RE: Aide pour coder "pro"^^ - Harparine - 06-02-2008

Personnellement, je trouve que l'avantage le plus "visible" de la POO est le faible nombre de paramètre à passer dans des fonctions. En effet : un objet (c'est à dire la "matérialisation" de la classe dans le code) contient déjà un certain nombre de propriétés (variables) qui pourront être réutilisées dans ses propres méthodes (fonctions). Un exemple sur un script simple d'attaque :

- On part du principe qu'on a un personnage sur la carte. Chaque perso a 4 caractéristiques : Dextérité, Puissance, Mental, Volonté.
- On distingue deux types de personnages : guerrier et mage. Le guerrier réussit son attaque si il réussit un test de dextérité et ses dégâts seront fonction de sa puissance. Le mage réussit une attaque sur un test de mental et ses dégâts sont fonctions de sa volonté.
- Pour ne pas compliquer les choses, on ne tiendra pas compte d'une cible éventuelle : le héros tape dans le vide.

Tout d'abord : en procédural
Code PHP :
<?php

//On définit les caractéristiques de notre personnage.
$nom = "Georges";
$type = "guerrier";
$dex = 10;
$pui = 12;
$men = 5;
$vol = 7;

//On crée une fonction attaque qui renvoie 0 en cas d'échec et le nombre de dégâts en cas de réussite
//Cette fonction prends deux paramètres : la caractéristique utilisée pour l'attaque et celle utilisée pour les dégâts
function attaque($att, $deg) {
//Attaque : on lance un d20; si c'est inférieur ou égal à la carac, on passe à la suite
$lancerAtt = mt_rand(0, 20);
if(
$lancerAtt <= $att) { //L'attaque est passée !
//On calcule les dégâts (caracs de dégâts + d10)
$degats = $deg + mt_rand(0, 10);
$retour = $degats;
} else {
//L'attaque a échoué. Quel nul, ce Georges...
$retour = 0;
}

return
$retour;
}


//On réalise l'attaque :
echo "$nom attaque avec tout son talent de $type !<br />";
if(
$type == "guerrier") {
$bilan = attaque($dex, $pui);
} else {
$bilan = attaque($men, $vol);
}
if(
$bilan) {
echo
"$nom a réussit son attaque ! Quel héros, ce $nom !!! Les dégâts sont de $bilan points de vie...";
} else {
echo
"$nom a loupé son attaque... Quel gros nul, ce $nom !";
}

?>

Ensuite, en POO :
Code PHP :
<?php

//On déclare la classe Heros
class Heros {

//On déclare les propriétés
public $nom = "Georges";
public
$type = "guerrier";
public
$dex = 10;
public
$pui = 12;
public
$men = 5;
public
$vol = 7;

//On déclare les méthodes

//Constructeur de la classe
function __construct() {
}

//On crée une méthode attaque qui renvoie 0 en cas d'échec et le nombre de dégâts en cas de réussite
public function attaque() {
//Attaque : on lance un d20; si c'est inférieur ou égal à la carac, on passe à la suite
if($this->type == "guerrier") {
$att = $this->dex;
$deg = $this->pui;
} else {
$att = $this->men;
$deg = $this->vol;
}
$lancerAtt = mt_rand(0, 20);
if(
$lancerAtt <= $att) { //L'attaque est passée !
//On calcule les dégâts (caracs de dégâts + d10)
$degats = $deg + mt_rand(0, 10);
$retour = $degats;
} else {
//L'attaque a échoué. Quel nul, ce Georges...
$retour = 0;
}

return
$retour;
}
}

//On crée notre combattant
$Georges = new Heros();

//On réalise l'attaque :
echo $Georges->nom . " attaque avec tout son talent de " . $Georges->type . " !<br />";
$bilan = $Georges->attaque();
if(
$bilan) {
echo
$Georges->nom . " a réussit son attaque ! Quel héros, ce " . $Georges->nom . "!!! Les dégâts sont de $bilan points de vie...";
} else {
echo
$Georges->nom . " a loupé son attaque... Quel gros nul, ce " . $Georges->nom . " !";
}

?>

Bon, vous me direz qu'il y a autant voir plus de lignes de code en POO. C'est vrai ici car le code n'est pas compliqué mais dans le cas de création de plusieurs héros dans une page, on s'évite le test pour savoir si c'est un guerrier ou un mage, par exemple. On pourrait l'éviter en procédural, mais dans ce cas là, il faudrait passer 5 paramètres à la fonction attaque, ce qui est tout de même casse couilles (type + les 4 caracs).

L'autre grand intérêt de l'objet est de pouvoir passer un objet cible en paramètre de la méthode attaque (ça suppose bien sûr de modifier mon code) plutôt que de transmettre les caractéristiques du défenseur une par une en paramètres ou par le biais d'un tableau :
Code PHP :
<?php 
$Georges
= new Heros();
$Kevina = new Heros();
$Georges->attaque($Kevina);

Enfin, si on imagine qu'il y a de très grosses différences entre Mage et Guerrier, on peut créer une classe enfant, héritée sur le modèle de la classe Héros, avec des méthodes spécifiques des propriétés supplémentaires, etc. La création reviendrait alors à faire :
Code PHP :
<?php 
$Georges
= new Guerrier();
$Kevina = new Mage();
$Kevina->attaque($Georges);

@+ Wink


RE: Aide pour coder "pro"^^ - pascal - 06-02-2008

fonction ou POO ?

question intéressante, réponse qui le sera aussi :

avec les fonctions, on rend le code plus court, plus centralisé, tout ça.
on se dit qu'on est le roi, mais non, car on va avoir encore du boulot chiant : faire évoluer le script.

exemple :
on a un script d'inscription, login + mail + pass + pass confirmation
on a fait de jolies fonctions aux noms parlants :
verifierDonnees( $login, $mail, $pass, $pass_confirmation )
enregistrerCompte($login, $mail, $pass)
envoyerConfirmationMail($login, $mail)

on veut passer à la V2, et ajouter des races, à choisir à l'inscription. on doit modifier les fonctions :
verifierDonnees( $login, $mail, $pass, $pass_confirmation, $race)
enregistrerCompte($login, $mail, $pass, $race)
envoyerConfirmationMail($login, $mail, $race)

mais aussi modifier le script utilisant les fonctions : on doit ajouter partout $race aux arguments.

c'est facile si tout se trouve dans un seul script, mais si ça se trouve sur plein de pages ?
comment être sûr de ne pas en oublier ? (cf ex de zamentur fonction placer() qui se retrouve partout )
comment être sûr qu'on ne va pas se planter dans un script et taper $rcae au lieu de $race ?

avec une classe, on cache les parametres de fonction dans l'objet.

concretement, on ajoute un membre ( ou attribut ) $race dans la définition de la classe;
ensuite on modifie les méthodes ( équivalent de fonctions ), c'est à dire le code à l'intérieur des méthodes, pour tenir compte de la race. mais on ne modifie pas la signature de la méthode ( le nombre des arguments, en gros ) puisqu'il n'y a pas d'arguments à passer à la méthode : tout est dans l'objet.

ex :
fonction verifierDonnees( $login, $mail, $pass, $pass_confirmation, $race)
devient
méthode verifierDonnees()
avec un objet de structure :
Code PHP :
<?php 
class inscription{
public
$login;
public
$mail;
public
$pass;
public
$pass_confirmation;
public
$race;
}

A+

Pascal, dodo


RE: Aide pour coder "pro"^^ - pascal - 06-02-2008

pourquoi faire une fonction pour un gros code utilisé une seule fois ?

pour rendre le script ( = enchainement logique de fonctions basiques ) plus lisible. ce qui doit resortir, c'est la logique du script. si les fonctions sont assez nombreuses et bien pensées, on peut avoir un script qui ressemble à du pseudo code ( = le processus tel qu'on l'écrit sur un bout de feuille aux toilettes )

exemple :
Code PHP :
<?php 
// script d'inscription
if( verifierDonnees( $login, $mail, $pass, $pass_confirmation ) == TRUE )
{
// données valides
enregistrerCompte($login, $mail, $pass);
envoyerConfirmationMail($login, $mail);
afficherCestBon();
}else{
// erreur dans le formulaire
afficherErreur();
}

c'est tout l'interêt des fonctions, même si elle ne servent qu'une fois.
le 2e interêt, c'est de pouvoir utiliser ces fonctions ailleurs. où ça ?
non pas DTC, mais DTT : dans ton test, c'est à dire dans un script qui vérifie que la fonction renvoie les résultats attendus. pour cela, on utilise plusieurs fois la fonction avec des paramètres différents, devant renvoyer une fois vrai, une fois faux, etc etc.

on en arrive aux tests unitaires, qui renforcent la qualité du code, sa résistance au changement, sa résistance à la triche ( on peut imaginer reproduire une utilisation frauduleuse d'une fonction, pour prouver que la triche est possible; ensuite on colmate la bréche, vu qu'on l'a identifiée. cf le sujet/débat "Logging" )

bref, que du bonheur ! Smile

A+

Pascal


RE: Aide pour coder "pro"^^ - Ziliev - 06-02-2008

Ah ba voila, là je comprend ^^

Effectivement c'est interessant, plus besoin de passer ses paramètres ils sont déja stockés et accessibles par les fonctions (c'est surtout ca qui est génant en fait avec les fonctions, niveau variables utilisables c'est vraiment QUE ce que tu donnes en paramètres et 'faut pas avoir envie d'en rajouter ou d'en enlever une). Comme vous dites l'intérêt c'est de pouvoir facilement ajouter/supprimer un paramètre sans changer tous les appels de la fonction, et pouvoir envoyer tous les paramètres d'une autre instance sans refaire une liste de 2km de long.

Vous m'interessez (maintenant que j'y pense on avait effleuré le sujet en JavaScript durant mon cours de prog de site web :$), effectivement c'est plus de simplicité, du code plus léger et une plus grande maléabilité du code. J'aime. Bon par contre si vous aviez pu m'apprendre ca avant que je finisse le gros de mon jeu c'aurait été encore mieux xD 'me reste plus qu'à apprendre les nouvelles syntaxes quoi (ce que je ferais dès les prochaines vacances parce que là vous m'avez convaincu ^^).


Voila, je sais pas pour le créateur du sujet mais pour moi c'est clos (j'me suis un peu approprié le sujet, désolé, c'était une question qui m'interessait beaucoup Tongue), je serais même d'avis que regrouper ce raisonnement "c'est un peu comme les fonctions MAIS ..." dans un p'tit message court pour la postérité ca serait un joli cadeau pour tous les codeurs en herbe qui se posent la question comme nous Smile Merci à tous pour votre patience ^^