JeuWeb - Crée ton jeu par navigateur
[POO] ma class DATA - 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 : [POO] ma class DATA (/showthread.php?tid=4876)



[POO] ma class DATA - php_addict - 06-06-2010

bonjour

je suis en train de revoir la façon dont j'ai de gérer les données constantes, pour le moment j'utilisais des tableaux de variables et des includes...

je tente le coup en POO, et j'aimerais vous soumettre ma class DATA pour que vous me disiez ce que vous en pensez:

Code PHP :
<?php 
$DATA
=new DATA(); // instanciation de la class
echo $DATA->value[2]; // on recupere une valeure
$DATA=NULL; // destruction de la class

class DATA
{
public
$value=Array ('0' => 'valeur1' , '1' => 'valeur2' , '2' => 'valeur3' );
}

mon principal objectif etant de simplifier ceci: je suis en procedural pour le moment et j'utilise des function(): j'ai une fonction qui appelle une autre fonction qui elle même appelle une autre fonction, et les 2 fonctions appelées ont besoin des données constantes $value

Code PHP :
<?php 
function fonction_principale()
{
fonction_1($value);
}


function
fonction_1($value)
{
// doo something with $value
fonction_2($value);
}

function
fonction_2($value)
{
// doo something with $value
}

est ce que c'est ce que l'on appelle "héritage" en POO, j'avous que je suis en peu largé sur ce point en ce moment

bon week end Wink


RE: [POO] ma class DATA - Allwise - 06-06-2010

L'héritage est un concept qui porte sur les classes, pas sur les fonctions.
Si tu devais porter ton code en POO, tu pourrais mettre les 3 fonctions dans la même classes si elles font toutes les 3 partie de la même entité. Si c'est pas le cas et que tu as plusieurs entités, à toi de voir le lien qui les unit : héritage, composition.

Pour les constantes, si tu veux les mettre dans une classe tu dois les déclarer comme tel :
Code PHP :
<?php 
class maClass{
const
CONSTANTE1 = 'maconstante';
const
CONSTANTE2 = 'maconstante2';
}

// pour accéder à une constante, il suffit de faire
$const = maClass::CONSTANTE1;
Avec ta méthode t'es obligé d'instancier un objet pour récupérer les données, ce qui n'est pas très logique. De plus, en l'état elles sont modifiables donc elles sont variables, pas constantes.


RE: [POO] ma class DATA - php_addict - 06-06-2010

salut, merci pour tes conseils et tes précisions et pour le bout de code Wink

par contre on ne peut pas mettre un array dans une constante, quelle serait la solution dans mon cas alors ?

je suis en train de lire tout les tuto php/poo et pffff c'est galère pour moi...

PS: effectivement mes 3 fonctions font partie de la même entité


RE: [POO] ma class DATA - Plume - 06-06-2010

L'héritage permet d'utiliser les méthode d'une classe mère depuis une classe fille.

<?php

class Unit {
protected function eat() {

}

protected function drink() {}
}

class Warrior extend Unit {
protected function attack() {

}

protected function defend() {

}
}

class Peon extend Unit {
public function cut_wood() {

}
}

$warrior = new Warrior;
$warrior->attack();
$warrior->eat();

$peon = new Peon;
$peon->eat();
$peon->drink();
$peon->cut_wood();

Sinon, je ne comprends pas ta problématique des constantes. Qu'est-ce que tu n'arrives pas à faire, qu'est-ce que tu veux, ... ?


RE: [POO] ma class DATA - Sephi-Chan - 06-06-2010

Moi j'aime les péons !

En fait, php_addict, je pense que tu as un problème plus général avec tes données constantes. Peux-tu nous donner des exemples (plusieurs) de telles données ?


Sephi-Chan


RE: [POO] ma class DATA - php_addict - 06-06-2010

(06-06-2010, 12:12 PM)Sephi-Chan a écrit : En fait, php_addict, je pense que tu as un problème plus général avec tes données constantes. Peux-tu nous donner des exemples (plusieurs) de telles données ?

ok merci de ton aide, voici ce que j'ai comme (mauvaise?) habitude:

Mes données constantes: url /include/troupes.php

Code PHP :
<?php
// nom description prix OFF
$DATA_troupes[1] = array( 'fantasin1' , 'le fantasin1 bla bla bla' , '100' , '10' );
$DATA_troupes[2] = array( 'fantasin2' , 'le fantasin2 bla bla bla' , '200' , '20' );
$DATA_troupes[3] = array( 'fantasin6' , 'le fantasin3 bla bla bla' , '300' , '30' );
$DATA_troupes[4] = array( 'fantasin4' , 'le fantasin4 bla bla bla' , '400' , '40' );
$DATA_troupes[5] = array( 'fantasin5' , 'le fantasin5 bla bla bla' , '500' , '50' );
?>

Exemple d'utilisation des donnees constantes


Code PHP :
<?php 
//
// (les $arg sont des arguments factices)
//
//________________________________
// resolution() |
//________________________________|
function resolution()
{
include(include/
troupes.php);

mouvement_de_troupes($DATA_troupes , $arg1 , $arg2, $arg3);
//
// d'autres appel vers d'autres function de resolution
//
}


//________________________________
// mouvement_de_troupes() |
//________________________________|
function mouvement_de_troupes($DATA_troupes , $arg1 , $arg2, $arg3)
{
attaque($DATA_troupes , $arg1 , $arg2, $arg3);
//
// d'autres appel vers d'autres function de resolution de mouvements de truopes
//
}
//________________________________
// attaque() |
//________________________________|
function attaque($DATA_troupes , $arg1 , $arg2, $arg3)
{
//
// du code
//
}

mes principaux doutes:

- si dans une boucle (while) on apelle une function qui include un fichier alors je trouve ca pas très propre.
- lors de l'include on inlcut tout les paramètres meme ceux inutiles (mémoire accrue) par exemple pour la resolution d'une attaque on n'a pas besoin de la description du type d'unité


RE: [POO] ma class DATA - Sephi-Chan - 06-06-2010

Ok donc, ces données sont les différents types d'unités disponibles dans ton jeu. Je suppose qu'il y a aussi leurs valeurs d'attaque, de défense, de déplacement, etc. ?
Pourquoi ne pas les stocker en base de données, puisque tu préfixes (très justement) ton tableau avec le terme DATA ?

Ici, ça t'oblige à passer tes données systématiquement à tes fonctions pour qu'elles sachent qu'un chevalier tape à 24 et à une défense de 16. Donc quand tu résous une attaque du joueur A sur le joueur B, pour chaque unité impliquée dans le combat, tu dois aller vérifier ses attributs dans ce tableau de données. Est-ce que je me trompe ?


Sephi-Chan


RE: [POO] ma class DATA - php_addict - 06-06-2010

(06-06-2010, 02:27 PM)Sephi-Chan a écrit : Je suppose qu'il y a aussi leurs valeurs d'attaque, de défense, de déplacement, etc. ?

effectivement

(06-06-2010, 02:27 PM)Sephi-Chan a écrit : tu dois aller vérifier ses attributs dans ce tableau de données. Est-ce que je me trompe ?

tu as raison

je me sens bête maintenant que tu me le dis mais je me sentais obligé de mettre mes données constantes dans des fichiers plutot que dans une base de données...pouquoi? car je voulais une certaine rapidité d'execution mais en réalité cela me bouffe de la mémoire pour rien...

donc la solution serait de mettre mes données constante dans une TABLE et de me faire une jolie function de recupération de données en fonction de ce que j'ai besoin ?

Merci encore mille fois Sephi-Chan de m'avoir ouvert les yeux sur ma mauvaise gestion de ces donnees


RE: [POO] ma class DATA - Sephi-Chan - 06-06-2010

Pas de raison de te sentir bête, tu n'es pas le premier à vouloir réinventer la base de données.

Maintenant, pour la solution à adopter, je dois dire que je ne sais pas trop : ça fait bien longtemps que je ne fais plus tout ça à la main.

Je pencherai pour une solution simple comme : récupérer les unités d'un joueur en faisant une jointure (grâce à une colonne unit_type_id) et on met tout ça dans un tableau de tableaux (au lieu d'un tableau d'objets si on utilisait la POO). Ainsi, le tableau rendu ressemblerait à ça :


Array
(
[0] => Array
(
[id] => 5
[name] => Chevalier
[player_id] => 1
[attack] => 24
[defense] => 16
[health] => 127
[max_health] => 200
[movement_speed] => 9
)

[1] => Array
(
[id] => 6
[name] => Chevalier
[player_id] => 1
[attack] => 24
[defense] => 16
[health] => 200
[max_health] => 200
[movement_speed] => 9
)

)

En plus le tableau est aplati, on a vraiment l'impression que les propriétés de l'unité sont hérités d'après son type.


Sephi-Chan


RE: [POO] ma class DATA - php_addict - 06-06-2010

je vais certainement opter pour cette solution

encore merci Wink