JeuWeb - Crée ton jeu par navigateur
Abstraction de Config avec PHP 5.3 - 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 : Abstraction de Config avec PHP 5.3 (/showthread.php?tid=4984)

Pages : 1 2


Abstraction de Config avec PHP 5.3 - zeppelin - 12-07-2010




RE: Abstraction de Config avec PHP 5.3 - Sephi-Chan - 12-07-2010

Hello, j'ai modifié ton message pour reformatter ton objet JSON (sinon ça défigurait totalement le forum) à l'aide de Javascript Beautifier.


Sephi-Chan


RE: Abstraction de Config avec PHP 5.3 - srm - 13-07-2010

Je vois pas trop l'utilité de ton système...


RE: Abstraction de Config avec PHP 5.3 - zeppelin - 13-07-2010

Salut Oxman :-)

L'utilité ressort uniquement (surtout) sur des jeux ou il y a des quantités importantes de données brutes.

Comme avec les modèles BDD, il y a des méthodes qui travaillent sur ces données dont tu as besoin de façon répétitive sur plusieurs pages. Avec ce "système", tu as tout ce dont tu as besoin: Un singleton (j'imagine que ta connexion BDD est également un singleton...), et des méthodes séparés pour chaque fichier (tables...), le tout en faisant uniquement un extend d'une classe mère qui suit des directives solides en étant abstrait et avec les "finals". Avant PHP 5.3 tu aurait du définir dans chaque classe fille un propre singleton (duplication de code, bwerk).

Avec ce system (le late static binding), tu peux étendre les singletons, ce qui n'était pas "vraiment" possible avant.

Après c'est sur que si toi tu n'as jamais eu le besoin d'avoir des méthodes précise qui travaillent sur tes données brutes de config, ce system est complétement inutile.

Je vais te donner un autre exemple tout simple pour te montrer l'utilité dans mon cas.

Je mets la source PHP et non JSON (plus lisible)

Code PHP :
<?php 
$array
['material'][0] = 'gold';
$array['material'][1] = 'wood';
$array['material'][2] = 'stones';
$array['material'][3] = 'iron';

$array['food'][0] = 'fruits';
$array['food'][1] = 'rice';
$array['food'][2] = 'bread';

$array['ingredient'][0] = 'wheat';
$array['ingredient'][1] = 'hop';
$array['ingredient'][2] = 'flour';

$array['luxury'][0] = 'beer';
$array['luxury'][1] = 'tobacco';
$array['luxury'][2] = 'liquor';

return
$array;

Comme tu le vois, si je récupère mon fichier json, j'ai un array à 2 dimensions.

60 fois (je dis au bol) dans les codes de mon jeu j'ai besoin de cette array tel quel, et 60 fois je veux uniquement la 2ème dimension (je veux donc un array avec uniquement les ressources même, sans les catégories).

ça ne serait pas très pro de faire 60 fois une magouille qui me renvoie mon tableau comme souhaité... C'est la que j'ai besoin d'une fonction qui le fait. Et comme je ne veux pas mettre mes fonctions n'importe ou (et que si en plus je peux hériter de pleins de bonne choses) j'ai donc créer ce systeme.

De plus, le jour ou tu décide de ne plus utiliser JSON, mais autre chose (XML ou je ne sais quoi), tu change uniquement Gamgeconfig.php sans te soucier de tout le reste... ton application vas fonctionner pareillement! Ou encore, tu utilise plusieurs formats... Il suffit de créer des lecteurs dans la classe Gameconfig.php, tout le reste n'est pas touché! Voilà en gros Undecided

En me relisant je ne suis pas vraiment sur d'avoir été beaucoup plus clair... Bonne chance pour me déchiffrer ^^


RE: Abstraction de Config avec PHP 5.3 - niahoo - 26-07-2010

YOp,

sympa comme démo, perso je pourrais pas trop l'utiliser tel quel ( php 5.2 ) ( A moins d'avoir une classe mère singleton avec appel comme ceci : Config::getInstance('buildings') ) ( pis bon j'aime pas les singleton :p )

J'ai déjà utilisé du Json pour voir, mais je me demande ce qui est le plus rapide, parser du JSON ou parser un recordset de mySQL ?


RE: Abstraction de Config avec PHP 5.3 - srm - 27-07-2010

Pour parler un peu des Singleton, plus je potasse Scala plus je me rends contre que c'est le langage Script le plus souple/puissant que je n'ai jamais vu, une classe s'écrit ainsi :
Code PHP :
<?php 
class MaClasse {
val id = Math.random

def quiJeSuis
() = "Une classe Singleton id " + id
}

val a = new MaClasse
println
(a quiJeSuis)

Un singleton ainsi :
Code PHP :
<?php 
object MaClasseSingleton
{
val id = Math.random

def quiJeSuis
() = "Une classe Singleton id " + id
}

println(MaClasseSingleton quiJeSuis)

Première remarque, au lieu d'écrire :
Code PHP :
<?php 
println
(a quiJeSuis)

J'aurais pu écrire :
Code PHP :
<?php 
println
(a.quiJeSuis())

Mais Scala viste à éliminer tous le superflus inutile qui alourdis la lecture.
De plus, Scala suit le principe "Uniform Access Principle", tout étant objet on doit pouvoir accéder à tous les objets de la même façon, sans savoir si c'est une méthode, une classe, une variable, d'où l'aspect facultatif du . et des () lorsque l'on a qu'un argument ou pas d'argument.

Concernant donc l'exemple plus haut, pour transformer une classe en singleton il suffit de remplacer le mot clé "class" par "object", un objet étant de part sa nature unique, la classe devient automatiquement un singleton, simple et sexy Wink
Autre remarque, j'ai écris :
Code PHP :
<?php 
def quiJeSuis
() = "Une classe Singleton id " + id
Mais l'écriture "complète" serait la suivante :
Code PHP :
<?php 
def quiJeSuis
() : String = { return "Une classe Singleton id " + id }

Première chose : Pourquoi = { } au lieu de { } comme dans les autres langages ?
En PHP ça sera :
Code PHP :
<?php 
function quiJeSuis() { return "Une classe singleton" }
Et non :
Code PHP :
<?php 
function quiJeSuis() = { return "Une classe singleton" }

En Scala si on utilise {} et non = {} pour lui il a affaire à une procédure et non une fonction, elle ne peut donc retourner que le type Void (null, ce type à pour nom Unit en Scala)
Si on utilise = {} ça signifie que l'on va avoir une fonction qui va retourner une valeur.

Ceci était le premier point.

Deuxième point :
Code PHP :
<?php 
def quiJeSuis
()
au lieu de :
Code PHP :
<?php 
def quiJeSuis
() : String
Le deuxième cas spécifique le type de retour sera "String".
Il faut privilégié la première écriture autant que faire se peut pour laisser le moteur de Scala inférer le type de la donnée retournée. Donc en gros, il va automatiquement déduire le bon type de la donnée retournée à la compilation et le mettre lui même. Il y a beaucoup beaucoup d'endroit en Scala ou l'inférence est automatique, le compilateur devine tout seul les types de variable, ça permet d'avoir un typage fort sans une certaine lourdeur d'écriture.

Troisième point, return est facultatif et on ne doit pas l'utiliser de manière générale, si on l'utilise on est obligé de préciser le type de variable que va retourner la fonction car le moteur d'inférence n'y arrive pas sinon. Et comme on l'a vu plus haut, il est recommandé de laisser le moteur d'inférence faire son travail.
Lorsque l'on utilise = { } dans une fonction (qui va donc retourner une donnée) la dernière donnée sera automatiquement retournée (comme en Ruby)

Quatrième et dernier point, l'utilisation des { } est totalement facultatif dans tous les cas, elle n'est utile que si on a pusieurs instructions à mettre dans le corps (le { } sert à définir des corps/body/block pour tout un tas de cas) sinon il suffit simplement d'écrire l'instruction

C'est pourquoi j'ai écris :
Code PHP :
<?php 
def quiJeSuis
() = "Une classe Singleton id " + id
et non :
Code PHP :
<?php 
def quiJeSuis
() = { "Une classe Singleton id " + id }

En gros grace à Scala on passe de ce type d'écriture :
Code PHP :
<?php 
def quiJeSuis
() : String = { return "Une classe Singletion id " + id }
à :
Code PHP :
<?php 
def quiJeSuis
() = "Une classe Singleton id " + id

Ce qui bien entendu allège grandement l'écriture et rend les choses pus lisible Wink


RE: Abstraction de Config avec PHP 5.3 - niahoo - 27-07-2010

mais un objet, au lieu d'une classe, peux tu l'instancier ? peux tu lui passer des paramètres en constructeur ? pour ensuite utiliser un mot clé de type 'this' ?


RE: Abstraction de Config avec PHP 5.3 - srm - 27-07-2010

Ca dépend exactement ce que tu veux faire en fait, un objet c'est un objet, donc tu ne l'instancies pas.
Mais par contre quand tu vois que j'utilise la variable "id" dans mon objet, c'est en fait "this.id"


RE: Abstraction de Config avec PHP 5.3 - niahoo - 27-07-2010

ça ce serait valide ?

Code :
object MaClasseSingleton {
        val id = null // ou Unit ?

    def quiJeSuis() = "Une classe Singleton id " + id

    def pseudoConstructeur ( id ) {
        MaClasseSingleton.id  = id
    }
}

println(MaClasseSingleton quiJeSuis)



RE: Abstraction de Config avec PHP 5.3 - srm - 27-07-2010

Je suis en train de voir pour te pondre un exemple par rapport à ce que tu veux, en fait il faut passer par le pattern Factory et je regarde comment le faire le plus proprement possible Smile