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

Pages : 1 2 3 4 5 6 7 8


RE: Valueobject - Xenos - 08-06-2015

> se compare à lui même, tout comme + qui s'additionne à lui même dans mon exemple.

Perso, je n'ai pas de raison d'interdire Pomme + Banane = Fruits (si c'est utile). Mais la question était plus centrée sur la loi de composition interne, c'est à dire de Pomme(3) + Pomme(2) = Pomme(5) (c'est [url=http://fr.wikipedia.org/wiki/Loi_de_composition_interne}la définition d'une telle loi[/url]). J'ai du coup encore moins de raison d'interdire Pomme + Pomme ^^

D'ailleurs, si Argent{100,$}+Argent{200,€}=exception pour toi, alors Argent+Argent=Exception ? et donc ValueObject+ValueObject=Exception quelque soit le valueobject? Ou c'est juste Exception parce que les monnaies diffèrent?


RE: Valueobject - Ter Rowan - 09-06-2015

a partir du moment ou on peut additionner des types natifs, je ne vois pas pourquoi on ne pourrait pas le faire avec les valueobjects

int + float
string + int

etc..

pour faire cela il faut juste développer les conversions qui vont bien

et du coup

si pomme et banane on un pgcc (plus grand commun conversion, oui je viens d'inventer) alors banane + pomme = quelque chose
si par contre on n'a aucune conversion disponible alors exception


RE: Valueobject - srm - 09-06-2015

J'en ai discuté avec plusieurs personnes de cette histoire Pomme + Poire = Fruit(2)
Pour tous la réponse a été non.

Que ça n'avait pas spécialement de sens, mais plus encore pas d'intérêt.
J'ai pourtant fait l'avocat du diable en essayant d'y montrer l'intérêt.

Mais au final je ne vois pas déjà en pratique quand ça servirait, vous avez des cas ?


RE: Valueobject - Xenos - 09-06-2015

Initialement, je parlais de Pomme+Pomme qui peuvent s'additionner différemment.

Mais dans le cas de Pomme+Poire, l'exemple de Ter Rowan est pertinent: int+double (ou tout autre A+B avec A et B partageant des relations d'héritage).

Un cas d'utilisation pourrait donc être {Entier}+{Fraction}={Fraction} ou {Complexe}+{Fraction réelle}={Complexe}

Plus généralement, tout cas où on aurait un cast implicite: (X)A+(X)B=X


RE: Valueobject - niahoo - 09-06-2015

(09-06-2015, 02:57 PM)srm a écrit : J'en ai discuté avec plusieurs personnes de cette histoire Pomme + Poire = Fruit(2)
Pour tous la réponse a été non.

Que ça n'avait pas spécialement de sens, mais plus encore pas d'intérêt.
J'ai pourtant fait l'avocat du diable en essayant d'y montrer l'intérêt.

Mais au final je ne vois pas déjà en pratique quand ça servirait, vous avez des cas ?

5 fruits et légumes par jour !


RE: Valueobject - Max72 - 02-09-2015

Plop !

Petit déterrage pour vous montrer comment moi j'implémente mes value objects.
On pourrait faire plus,mais y'a tout pour comprendre,  si ça intéresse encore quelqu'un :
https://gist.github.com/Max-koder/224c1488db1e05c54755


RE: Valueobject - Xenos - 02-09-2015

Coté code, tu peux alléger fusionner les if ( ... instanceof ...) suivit d'un return : return (... instanceof... && <<le return existant);
Egalement, pourquoi avoir redéfini les __set(), surtout sans rien y faire? Perso, je n'y aurai pas touché, à défaut, j'aurai levé une exception (là, "$myValueObject->mesgenoux = 2" ne lèvera aucune erreur, mais ne fera rien).

Coté business, les rues sont comparées par nom... Mais quid de deux rues du même nom dans deux villes différentes? Elles seront considérées comme 'isEqual()'...


RE: Valueobject - Max72 - 02-09-2015

Pour les if etc, c'est voulu, cas pédagogique.
Ensuite, je défini les __set pour éviter une fatal error (accès à une propriété privée), pas certain que ce soit une bonne idée mais bon..

Enfin : Oui les rues et villes sont comparées par nom (il pourrait y avoir 2 villes avec le même nom), parce que ça m'importe peu.
Le fait de tester la rue sert uniquement dans le test d'une adresse complète dans mon cas, et même dans la réalité je ne vois pas l'utilité.
Par exemple avec une localisation, si la longitude est la même, ça ne signifie pas que la localisation soit la même, la latitude peut-être différente, ça reste quandmême la même longitude Smile

En fait ce code est sorti du contexte: j'essaye d'écrire un billet sur ce thème, voilà pourquoi le code n'est pas optimal mais plus 'démonstratif'.


RE: Valueobject - niahoo - 02-09-2015

Sympa.

Effectivement, plutôt qu'une interface, je ferais plutot une abstract class avec une exception dans la méthode __set. Sinon, c'est cool.

Tiens, ça me donne envie de montrer les protocoles elixir


RE: Valueobject - Xenos - 02-09-2015

Citation : Je défini les __set pour éviter une fatal error (accès à une propriété privée), pas certain que ce soit une bonne idée mais bon..
Je te confirme: c'est une mauvaise idée. Masquer les erreurs ainsi, c'est autoriser leur démultiplication et la mort direct du projet quand ces erreurs seront nombreuses et surtout impistables (mais mais! mon code fait n'importe quoi! pourtant y'a pas d'erreur...)

Citation :Par exemple avec une localisation, si la longitude est la même, ça ne signifie pas que la localisation soit la même, la latitude peut-être différente, ça reste quandmême la même longitude

Oui, dans le cas de la longitude, je suis d'accord car deux valeurs de longitude égales, c'est deux longitudes égales (en partant du postulat qu'on ne considère qu'une seule planète). Dans le cas des rues, c'est différent: deux rues de même nom sont deux entités différentes.
Là, c'est pour moi, c'est comme si tu comparais deux billets sur la base de leur seule valeur faciale: deux billets de 100 ne sont pas forcément les mêmes car la monnaie (ou la ville) peut différer.

Après, faut juste que ce soit clair dans le commentaire. "sont considérés comme égaux", c'est léger, et cela devrait être détaillé dans l'implé de chaque méthode.