JeuWeb - Crée ton jeu par navigateur
Compass : East Oriented - 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 : Compass : East Oriented (/showthread.php?tid=7165)

Pages : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30


RE: Compass : East Oriented - niahoo - 01-09-2015

Ah ben non justement memento va te prendre de la RAM parce qu'il doit se souvenir des objets que tu lui as donné. Avec des clones ou un langage immutable, les copies qui ne sont plus utilisées seront libérées par le garbage collector.

(edit: fin bon, c'est pas en 6 lignes de code que t'arrives au niveau fonctionnel d'un autre paradigme non plus hein).


RE: Compass : East Oriented - Max72 - 01-09-2015

Oui mais le memento tu ne l'utilises que quand tu le souhaites, aussi il ne va pas garder 200 ou 300 instances en mémoire (sinon je veux bien un exemple d'utilisation aussi intense).
Pour le garbage collection je ne connais pas assez, mais je pensais d'ailleurs que le pattern flyweight était là pour palier à la grosse consommation mémoire de ces clones.


RE: Compass : East Oriented - Xenos - 01-09-2015

Citation :en PHP, quand tu reviens en arrière sur un objet, tous les autres objets auxquels tu avait passé la référence de ta première copie doivent être modifiés pour pointer vers la nouvelle copie.

Ouep, la solution étant alors d'altérer l'objet existant au lieu de le remplacer (car mutable), ou alors, de faire du Proxy Smile
Dans l'idée, une classe "ProxyChose" référence un objet "Chose" (et qui passe ses appels de méthodes à ce "Chose"), et ce "ProxyChose" est référencé par les autres objets du monde. Pour restaurer "Chose", on la récupère du "Memento" et on la passe au "ProxyChose": tous les objets qui pointaient vers "ProxyChose" pointent toujours dessus, et tous les appels de méthodes reçus par "ProxyChose" repartent vers le nouveau "Chose".
C'est vrai qu'alors, on ne change pas ce vers quoi le monde pointe (il pointe vers "ProxyChose", qui ne change pas) mais le comportement est similaire.

Oui, Memento sera plus gourmand que le clone seul, puisque le Memento, c'est "Object Memento + clone". Ce genre de considération (quantité de mémoire occupée), mieux vaut ne s'en préoccuper qu'une fois qu'on rencontre des problèmes plutôt qu'avant. Le problème, c'est que dès qu'on parle "d'optimisation", on a une image positive en tête... On devrait plutôt parler de "Radinerie de mémoire" Smile

En PHP, le garbage collector fera le même taff: il virera le cloné s'il n'est plus référence (et le cloné ne sera plus référencé si le Memento ne l'est plus).


Note que pour les considérations mémoires, Memento présente l'avantage d'être "Flyweightable" comme le dit Max. Dans l'idée, le "Memento" peut conserver la liste des "Memento" en mémoire, regarder dans cette liste s'il existe déjà un exemplaire de l'objet à cloner, et si oui, il ne le clone pas et y fait référence.

Code PHP :
<?php 
interface IMemento {
public function
getCopy();
}

class
Memento IMemento {
//...
}

class
FlyweightMemento implements IMemento {
private static
$mementos = array();
private
$stored;

public function
__construct($object) {
$copy = null;
foreach (static::
$mementos as $memento)
if (
$memento->getCopy() == $object)
$copy = $object;
if (
$copy == null) {
$this->stored = clone $object;
static::
$mementos[] = $this->stored;
}
else
$this->stored = $object;
}
}



RE: Compass : East Oriented - niahoo - 01-09-2015

Perso je suis tout à fait pour utiliser toute la RAM disponible. Aucun problème ! D'ailleurs pour le moment mon jeu n'utilise QUE de la RAM, pas de base de données. Je répondais juste à l'argument comme quoi les clones ça bouffe de la ram par rapport à memento. C'est l'inverse, dans le sens ou memento tu aura tendance à avoir un objet qui garde en mémoire les autres. Si tu as plein d'objets memento effectivement ils peuvent être garbage-collectés aussi. Si c'est pour en arriver à 1 memento par clone, les clones vont aussi bien pis au moins c'est direct dans la classe, elle se clone toute seule, et c'est bon Smile.

Pour les proxy, oui, bien sûr, tu peux rajouter une surcouche à chaque fois que ton modèle a un défaut. ça me fait penser à cet article : http://www.unlimitednovelty.com/2011/10/nodejs-has-jumped-shark.html

Personnellement je préfère prendre le problème à bras le corps. Un langage immutable, ou à défaut cloner dans mes classes, même si c'est moche. (En fait, le plus gros problème de East, c'est pas que conceptuellement c'est mauvais, non, c'est juste que c'est MOCHE -- argument très intéressant je sais).


RE: Compass : East Oriented - Xenos - 01-09-2015

Pour ma part, je préfère centraliser chaque comportement commun (c'est sûr que si j'ai 2 pauvres classes avec un clone, je ne vais peut-être pas me lance de suite dans le Memento) quitte à avoir ensuite des classes qui ne font qu'assembler ces comportements (un "Chose", un "Memento" et un "ChoseImmutable").

Si tu n'utilises que la RAM, comment cela va se passer en cas de coupure du serveur (ça dévie du sujet mais bon...)?


RE: Compass : East Oriented - niahoo - 01-09-2015

Avoir tous les objets immutable dans le langage n'est-ce pas la meilleur centralisation ?: pas d'implémentation manuelle Smile Bon tu auras compris que je ne parle pas de PHP bien entendu.

(je savais vraiment pas où mettre mon '?' alors je l'ai mis là).

En cas de coupure serveur on perd tout, le jeu n'est même pas fini et je fais des tests, donc je m'en fous. par la suite il faudra bien choisir une persistance en effet, mais ça sera une persistance asynchrone : les joueurs connectés seront en RAM et les write seront mis en queue.


RE: Compass : East Oriented - Xenos - 01-09-2015

Oui, c'est pour cela que si on veut du full immutable, je change de langage (oh, salut XSL et ses variables immutables ! ☺). Sur le même principe: si je veux du 100% East, je change de langage et je passe sur un langage East.
Ou alors, je centralise le East: j'encapsule mes objets dans une classe "East" qui passe les appels de méthodes à son encapsulée ("Decorator") et qui ne return que $this:

Code PHP :
<?php 
class EastDecorator {
private
$decorated;

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

public function
__call($name, $arguments) {
call_user_func_array(array($object, $name), $arguments);
return
$this;
}

public function
__set($name, $value) {
$object->{$name} = $value;
return
$this;
}

public function
__set($name, $arguments) {
throw new
BadMethodCallException("East does not allow getters");
}
}

Voilà, là, on a du East pur, à condition d'utiliser new EastDecorator(/*old new call or object*/) au lieu de "new" tout court.


RE: Compass : East Oriented - niahoo - 01-09-2015

Tu devrais vraiment tester Elixir. Je pense que ça te plairait.


RE: Compass : East Oriented - Xenos - 01-09-2015

Si on l'utilisait au travail, je m'y serai intéressé... mais je priorise un peu les choses. J'essaierai quand même à l'occasion, pour l'expérience (de toute façon, l'utiliser en production me semble utopique puisqu'il faudrait que je change aussi l'hébergement...)


RE: Compass : East Oriented - niahoo - 01-09-2015

Bah n'importe quel serveur privé fait l'affaire. En tout cas c'est totalement production-ready.

Tu ne bosses quand même pas que sur des trucs dont tu te sers au travail ?