JeuWeb - Crée ton jeu par navigateur
[Résolu] Création de classes - 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] Création de classes (/showthread.php?tid=676)



[Résolu] Création de classes - zneman - 05-04-2008

Bien le bonjour Smile
Afin de me mettre pleinement dans l'utilisation des fonctions (que je n'utilisais jamais avant), je me suis lancé dans la POO.
Après avoir passé ma matinée devant des tutos et des articles sur la POO, j'ai enfin compris son utilité et pour être franc... Ca me donne très envie Tongue (de coder ^^).

Bref... Je suis en ce moment en train de revoir complètement le plan de mon script d'attaque principal.
Je me suis dis "pourquoi faire les choses à moitié, commençons à y mettre de la POO tout plein !" Big Grin xD

Voila donc le début du début mais je voudrais savoir si je pars dans la bonne direction avant de me lancer dans les milliers de lignes Tongue

Code PHP :
<?php
class AttaqueArmesSiege {
public function
__construct($beliers, $trepans, $balistes, $espringales, $trebuchets,
$forceBeliers, $forceTrepans, $forceBalistes, $forceEspringales, $forceTrebuchets) {
$this->beliers = $beliers;
$this->trepans = $trepans;
$this->balistes = $balistes;
$this->espringales = $espringales;
$this->trebuchets = $trebuchets;
$this->forceBeliers = $forceBeliers;
$this->forceTrepans = $forceTrepans;
$this->forceBalistes = $forceBalistes;
$this->forceEspringales = $forceEspringales;
$this->forceTrebuchets = $forceTrebuchets;
}

public function
PourcentagesArmesSiege() {
$this-> Pourcentages = mt_rand(80,100) / 100;
return
$this->Pourcentages;
}

public function
AttaqueBruteArmesSiege() {
$this-> AttaqueBrute = ($this->beliers * $this->forceBeliers) + ($this->trepans * $this->forceTrepans)
+ (
$this->balistes * $this->forceBalistes) + ($this->espringales * $this->forceEspringales)
+ (
$this->trebuchets * $this->forceTrebuchets);
return
$this->AttaqueBrute;
}

public function
AttaqueNetArmesSiege() {
$this-> AttaqueNet = $this->AttaqueBrute * $this->Pourcentages;
return
$this->AttaqueNet;
}

public function
AfficherAttaqueNetArme() {
echo
$this->AttaqueNetArmesSiege();
}

public function
AfficherPourcentagesAttaqueArmesSiege() {
echo
$this->PourcentagesArmesSiege();
}
}
?>

Ce script permet de calculer la puissance des armes de siège et de lui appliquer un pourcentage. Je peux aussi afficher la puissante nette et les pourcentages.

Ce script est vraiment là à titre d'exemple, il est en réalité beaucoup plus complexe Sad

J'attends donc vos commentaires et suggestions (du moment que ceux ci sont bien argumentés xD).
Ne faites pas trop attention au fond, comme je l'ai dis, ce n'est pas très optimisé et faut changer quelques petits détails (comme arrondir les pourcentages Tongue).

Merci d'avance !

Zneman


RE: Creation de classes etc.. POO - Ren Nelos - 05-04-2008

Bonjour zneman.

Première remarque qui s'apparente plus à un conseil, tu devrais faire des lignes de code moins longue. C'est très peu confortable de devoir déplacer la vue pour prendre connaissance du code. J'ajouterais également que tu devrais fournir des commentaires dans ta source surtout quand on commence quelque chose de nouveau pour soi. Cela dit, cela vaut pour n'importe quelle situation : commente !
Dans la même catégorie, je te conseillerais d'utiliser des noms de méthodes plus explicites. Par exemple, setMaVariable() plutôt que MaVariable().
Généralement, les noms de méthodes & de variables ne commencent pas par une majuscule ^_^

Ensuite, tu fais des $this->variableName. Seulement, tu as omis de déclarer les variables dans ta classe, qu'on appelle variables de classe.

Ce qui suit est également à proscrire :
Code PHP :
<?php 
public function AfficherAttaqueNetArme() {
echo
$this->AttaqueNetArmesSiege();
}
En effet, une méthode, que ce soit une fonction ou une procédure, n'a pas à faire d'affichage. Par contre, tu peux faire :
Code PHP :
<?php 
class AttaqueArmeSiege{
public
$AttaqueNetArmesSiege = '';

public function
getAfficherAttaqueNetArme() {
return
$this->AttaqueNetArmesSiege();
}
}

$oAttaqueArmeSiegeInstance = new AttaqueArmeSiege($props /* [, ...] */);

# J'affiche la variable $AttaqueNetArmesSiege de la classe AttaqueArmeSiege
echo '$AttaqueNetArmesSiege : <b>'.$oAttaqueArmeSiegeInstance->getAttaqueNetArmesSiege().'</b>';
Si la portée de la variable est public, il est aussi possible de faire :
Code PHP :
<?php 
$oAttaqueArmeSiegeInstance
= new AttaqueArmeSiege($props /* [, ...] */);

# J'affiche la variable $AttaqueNetArmesSiege de la classe AttaqueArmeSiege
echo '$AttaqueNetArmesSiege : <b>'.$oAttaqueArmeSiegeInstance->$AttaqueNetArmesSiege.'</b>';

Enfin, y a tooooouuuuut pleins de choses !

Ren, au plaisir.


RE: Creation de classes etc.. POO - Cartman34 - 18-04-2008

Quand je vois ca:
Code PHP :
<?php 
public function AttaqueBruteArmesSiege() {
$this-> AttaqueBrute = ($this->beliers * $this->forceBeliers) + ($this->trepans * $this->forceTrepans)
+ (
$this->balistes * $this->forceBalistes) + ($this->espringales * $this->forceEspringales)
+ (
$this->trebuchets * $this->forceTrebuchets);
return
$this->AttaqueBrute;
}

Je peux te conseiller d'utiliser un tableau qui référence tous les "armements".
En reprenant cet exemple(mais c'est aussi applicable à tres autres fontions, tu pourrais supprimer $this-> AttaqueBrute et renvoyer directement la valeur.


RE: Creation de classes etc.. POO - naholyr - 18-04-2008

Plusieurs commentaires :
- Tu utilises des attributs d'objet sans les déclarer, ces $this->Variable n'ont pas de sens.
- IGStaff++ : Tu définis des attributs parfois dans une méthode, sans jamais les utiliser ailleurs. Pourquoi alors passer par un attribut ?
- Lignes trop longues => factorisation ! Dans ce cas, la factorisation t'aurait mené peut-être à la solution de Ren, mais qui n'apporte rien d'autre que de réduire la ligne. Je te propose de rendre ton code évolutif, de manière à ce que tu puisses ajouter extrèmement simplement de nouvelles armes.
- Les méthodes "Afficher*" ne devraient pas exister, pour plusieurs raisons :
-- Une méthode d'une classe "utilitaire" ne devrait jamais rien afficher directement
-- Le seul intéret de ces méthodes semblent d'économiser des octets, sinon quel intérêt ? Or "Afficher" (8) prend plus de place que "echo " (5), donc vraiment aucun intérêt Wink

Tu ne t'en es pas rendu compte car tu n'as probablement pas assez réfléchi à ton code, mais tu manipules des objets dans cette classe, des objets de type "arme de siège", définis par :
- un nom
- une force
- une quantité

Code PHP :
<?php 
class ArmeSiege {

public
$nom;
public
$quantite;
public
$force;

public function
__construct($nom, $quantite, $force) {
$this->nom = $nom;
$this->quantite = $quantite;
$this->force = $force;
}

}

Ta classe ne manipulera donc plus une simple liste d'arguments posés "en dur", mais plutôt une liste d'armes de sièges "concrète" :

Code PHP :
<?php 
class AttaqueArmesSiege {

public
$armes = array();

public function
__construct($armes) {
$this->armes = $armes;
}

public function
AttaqueBruteArmesSiege() {
$result = 0;
foreach (
$this->armes as $arme) {
$result += $arme->force * $arme->quantite;
}

return
$result;
}

public function
PourcentagesArmesSiege() {

return
mt_rand(80,100) / 100;
}

public function
AttaqueNetArmesSiege() {

return
$this->AttaqueBruteArmesSiege() * $this->PourcentagesArmesSiege();
}

}

Et au lieu d'appeler :
Code PHP :
<?php 
new AttaqueArmesSiege($beliers, $trepans, $balistes, $espringales, $trebuchets,
$forceBeliers, $forceTrepans, $forceBalistes, $forceEspringales, $forceTrebuchets)
Ce sera un peu plus long mais probablement plus lisible :
Code PHP :
<?php 
new AttaqueArmesSiege(array(
new
ArmeSiege('beliers', $beliers, $forceBeliers),
new
ArmeSiege('trepans', $trepans, $forceTrepans),
new
ArmeSiege('balistes', $balistes, $forceBalistes),
new
ArmeSiege('espringales', $espringales, $forceEspringales),
new
ArmeSiege('trebuchets', $trebuchets, $forceTrebuchets),
))

Et surtout tu gagnes énormément en flexibilité, tu peux ajouter ou supprimer une arme sans rien toucher.


RE: Creation de classes etc.. POO - Sephi-Chan - 18-04-2008

Merci Naholyr, je formulais le même conseil avant de voir ton message en faisant une prévisualisation. Big Grin


Sephi-Chan


RE: Creation de classes etc.. POO - Cartman34 - 18-04-2008

Tu poussess la POO extremement loin naholyr.
Même si j'en ai compris le but, je n'ai trop compris comment tu veux utiliser ce code:

Citation :Et au lieu d'appeler :
Code PHP :
<?php 
new AttaqueArmesSiege($beliers, $trepans, $balistes, $espringales, $trebuchets,
$forceBeliers, $forceTrepans, $forceBalistes, $forceEspringales, $forceTrebuchets)
Ce sera un peu plus long mais probablement plus lisible :
Code PHP :
<?php 
new AttaqueArmesSiege(array(
new
ArmeSiege('beliers', $beliers, $forceBeliers),
new
ArmeSiege('trepans', $trepans, $forceTrepans),
new
ArmeSiege('balistes', $balistes, $forceBalistes),
new
ArmeSiege('espringales', $espringales, $forceEspringales),
new
ArmeSiege('trebuchets', $trebuchets, $forceTrebuchets),
))

Et surtout tu gagnes énormément en flexibilité, tu peux ajouter ou supprimer une arme sans rien toucher.



RE: Creation de classes etc.. POO - naholyr - 18-04-2008

Ce n'est pas poussé extrèmement loin, si on fait de l'objet on pense objet. Si c'est juste faire des classes pour faire des classes (histoire de grouper les fonctions) ça n'a pas plus d'intérêt que de faire du procédural et de bien organiser ses includes (ce qui n'est pas foncièrement "mal" soit dit en passant).

La programmation orientée objet, c'est détecter les objets qui sont utilisés dans le processus, ici l'objet de base c'est l'arme de siège. L'objet que tu manipules regroupe une liste d'armes de sièges, donc il est normal de créer une classe "arme de siège" Wink
Cela apparait très nettement quand on voit la liste initiale des paramètres.


RE: Creation de classes etc.. POO - zneman - 18-04-2008

Aie, j'en avais oublié ce message :$
Je suis pas mal occupé en ce moment IRL Sad
Honte à moi de n'avoir répondu Sad

Un grand merci à Ren Nelos pour sa réponse Smile
Merci aux autres aussi, je commence à comprendre Smile
Je posterais ce que j'ai fais plus tard dans la semaine je pense Smile