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 - 05-06-2015

Bonjour, oui tout à fait, nous pouvons faire un devis tout compris pour réparer votre voiture. Nous vous l'envoyons en trois exemplaires imprimé sur feuille d'or à en-tete. Ah, par contre nous ne faisons pas les réparations ...


RE: Compass : East Oriented - srm - 05-06-2015

(05-06-2015, 04:50 PM)Xenos a écrit : Je ne comprends pas ton argument: oui, elle ne peut rien faire d'autre: elle implémente l'interface qui dit "retourne ça". Pour moi, c'est comme si tu disais que la classe implémente l'interface Truc, donc elle est obligée d'implémenter Machin(Bidule $bidule): c'est pas souple.

Non, si mon Hero colle un pain au Kid, c'est du ressort de giveGold():
Code :
class Hero... {
   public function giveGold($object) {
       if ($this->malLune && $object instanceof Kid)
           $object->pafDansLePif();
       // Je sais que $object implémente Kid via instanceof, l'auto-complétion va donc me proposer cette méthode
       else {
             //...
       }
   }
}

J'attends l'exemple Beggar + !Femme parce que je ne vois pas comment tu l'extrapole.

Bah réfléchis, je vais pas tout te mâcher, c'est pourtant simple Sad

Ça choque que moi que un getter va soit retourner un objet Gold, soit faire tout un tas d'autres choses et rien retourner ?
Parce que pour moi c'est crade au possible...


RE: Compass : East Oriented - niahoo - 05-06-2015

Citation :Ça choque que moi que un getter va soit retourner un objet Gold, soit faire tout un tas d'autres choses et rien retourner ?


Citation :PHP7 avec giveGold c'est que si tu veux faire autre chose que retourner du Gold car tu es dans un cas particulier, tu ne peux pas. Donc tu restreints ton code il est moins souple

Comme je le disais, si on pouvait arrêter les vieux arguments réthoriques pour se concentrer sur le sujet ça serait sympa.

je me cite :
Citation :Tu ne peux pas prôner la souplesse là (surtout pour promouvoir une pratique bien dégueu) et prôner avant la rigidité d'avoir des méthodes publiques au lieu d'utiliser des instanceof qui sont plus souples. Faut être quand même cohérent et éviter les vieux sophismes.



RE: Compass : East Oriented - srm - 05-06-2015

East une pratique bien dégueu ? Ma foi.

Je prône la rigidité de l'API publique et la souplesse du code interne.
Ça semble logique non ?


RE: Compass : East Oriented - Xenos - 05-06-2015

Ça choque que moi que un getter va soit retourner un objet Gold, soit faire tout un tas d'autres choses et rien retourner ?

Ca pas ce que East veut autoriser?!
Doublé par niahoo ^^ (qui formule mieux que moi en plus)

La rigidité de l'API publique et la souplesse du code interne, c'est carrément ce que je t'ai montré tout à l'heure (j'ai pu changer les critères de choix de ma méthode sans rien péter de l'extérieur, si c'est pas une preuve de découplage ça).


Je maintiens: si tu veux que le Hero donne 2x son or si c'est Beggar+Femme, 4x si c'est Kid+Beggar, 1x pour les autres, tu vas faire:
Code PHP :
<?php 
class Kid ... {
public function
areYouBeggarByHero(Hero $hero) {
if (???)
// Tu fais comment là?
$hero->iAmBeggar($this);
else
$hero->iAmNotBeggar($this);
}
}

class
Women ... {
public function
areYouBeggarByHero(Hero $hero) {
if (???)
// Tu fais comment là?
$hero->iAmBeggar($this);
else
$hero->iAmNotBeggar($this);
}
}

class
Beggar ... {
public function
areYouWomenByHero(Hero $hero) {
if (???)
// Tu fais comment là?
$hero->iAmWomen($this);
else
$hero->iAmNotWomen($this);
}
}

class
Hero ... {
public function
askGoldByKid(Kid $kid) {
$kid->areYouBeggarByHero($this);
}

public function
askGoldByWomen(Women $women) {
$beggar->areYouBeggarByHero($this);
}

public function
askGoldByBeggar(Beggar $beggar) {
$beggar->areYouWomenByHero($this);
// Mais là, j'ai pas la condition Kid
// Comment je l'ajoute?
}

// Non-homogeneous method namings
public function iAmWomen(Beggar $beggar) {
$beggar->giveGold(2*$this->gold); // Duplicate
}
public function
iAmBeggarByKid(Kid $kid) {
$kid->giveGold(4*$this->gold);
}
public function
iAmBeggarByWomen(Women $women) {
$women->giveGold(2*$this->gold); // Duplicate
}
}

? O.OTu m'étonnes que t'avais pas envie de prendre le temps de me montrer...

J'ai l'impression d'avoir dupliqué du code...
Et j'ai pas le cas askGoldByBeggar qui serait demandé par un Beggar+Kid... (ça me semble le plus embêtant, car ça voudrait dire que East interdit certaines features).


Puis j'ai iAmBeggarByWomen qui est exposée en publique, c'est pas génial: une Women pourrait appeler cette méthode directement et racketer le Hero.

Donc soit j'ai fait de travers et je veux bien voir ta solution, soit ça sent l'usine à gaz.


RE: Compass : East Oriented - niahoo - 05-06-2015

Non bien dégueu : si ta fonction retourne un int mais que dans un certain cas on va faire autre chose, ça c'est dégueu, c'est de ça dont je te parlais. Encore une fois, je ne dis pas que East est mauvais.

Effectivement le terme "promouvoir" prête à confusion. Mais que ça ne t'empêche pas de voir quelle incohérence est mise en valeur par mon post : tu te contredis largement. Tu défends ton steak et c'est très bien, mais se contredire ça ne fait que saper ton argumentaire.


RE: Compass : East Oriented - srm - 05-06-2015

Je te rappel quand même que je montre du code depuis tout à l'heure, j'ai le droit de fatiguer un peu Tongue
Et je n'ai pas toutes les réponses en East, il suffit que je code mal un exemple en East parce que je n'y ai pas réfléchis assez pour que tout de suite vous montez au créneau pour dire que East c'est nul, donc pas évident Smile

Pour le ??? je savais pas que tu bloquais sur ce point précis.
Faudrait que j'y réfléchisse bien. Car là en fait on est en train de déterminer les différentes natures d'un objet d'après ses différentes interfaces, je ne sais pas si c'est la bonne façon de faire, j'en ai pas l'impression.

Dans ton cas l'API publique n'est pas rigide, elle est ouverte, c'est différent, elle accepte n'importe quoi c'est un peu comme si tu faisais un débat typehint ou pas du coup. Et bon tout le monde te dira que si tu mets du typehint tu minimises les risques.
Et là tu en mets pas donc bon.. C'est un autre débat que East sur le coup, car en East tu pourrais très bien faire comme tu dis.
Mais c'est pas considéré comme propre moi je trouve.

Pour avoir une opinion plus clair à ce sujet te concernant.
Moi dès que je passe en PHP7 100% de mes arguments seront typés dans une méthode et la sortie également. Quant à toi tu feras comment ?


RE: Compass : East Oriented - Xenos - 05-06-2015

Nan mais je t'ai dis que tu pouvais typehinter ta méthode, je t'ai même donné le lien direct dessus. Dans le dernier exemple de code, j'ai changé la façon dont le Barman réagit suivant si l'appeleur est Religieux ou non. Ma méthode est typehinté car elle accepte un certain type d'objet, et elle instanceof car son algorithme interne diffère suivant ce qui l'appelle. Ton areYou* n'est d'ailleurs qu'une réécriture de instanceof.
Mélange pas le débat du "le typehint c'est bien ou mal" avec le débat actuel qui est "le typehint dit je gère quoi, mais la méthode en interne peut bien faire des instanceof si elle veut renvoyer différentes réponses suivant le genre de l'objet".

En PHP7, les arguments qui en ont besoin seront typés (si ma méthode accepte n'importe quoi, grand bien lui fasse, je ne vais pas la typehinter de force Smile ), de même pour les retours.

East, l'idée est peut-être attrayante, mais si en y réfléchissant tu finis par tomber sur des cas impossibles, tu seras prêt à renoncer à East? Juste histoire de savoir si on est dans une optique de croyance ou non...


RE: Compass : East Oriented - niahoo - 05-06-2015

On dit pas que c'est nul. Et bon, tu peux fatiguer mais vu que on est juste en train d'implémenter une pauvre transaction de pièces d'or entre deux personnes seulement ... si East est génial, ça devrait prendre 5 secondes de moins qu'avec un getter et des instanceof, soit 0 secondes si je calcule bien.

Moi si j'ai bien compris East, c'est la classe qui fournit une API qui définit l'interface du code appelant. donc pour moi tout ça tient dans Beggar.

<?php

interface Beggar {
public function giveGold(Gold $gold);
public function areYouAWoman(Hero $hero);
public function areYouAKid(Hero $hero);
public function areYouAJudoka(Hero $hero);
}

interface Hero {
public function askGold(Beggar $beggar);
public function beggarIsAWoman(Beggar $beggar);
public function beggarIsAKid(Beggar $beggar);
public function beggarIsAJudoka(Beggar $beggar);
}



RE: Compass : East Oriented - srm - 05-06-2015

Après réflexion je pense qu'il faut plutôt créer une nouvelle interface pour chaque composition, par exemple : interface BeggarWomen implements Beggar, Women

Ça me semble plus intelligent comme façon de résoudre le problème.