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) |
RE: Compass : East Oriented - srm - 12-05-2015 (24-04-2015, 11:09 AM)Xenos a écrit : 1) Verbosité RE: Compass : East Oriented - srm - 12-05-2015 (24-04-2015, 11:09 AM)Xenos a écrit : Je considère plutôt les getters comme des moyens d'interroger l'objet sur une donnée. L'objet répond par une donnée (ou par un autre objet), qui peut tout à fait venir des propriétés internes de la classe, d'une base de données, d'une propriété statique, ou d'une valeur aléatoire. Oui mais tu couples bien plus tes objets, puisque si tu fais $user->getSomething() tu imposes à l'objet user de te retourner quelque chose. Si tu fais $user->askSomethingByCountry($country) tu laisses la liberté à l'objet user de faire ce qu'il veut. De ne rien répondre, ou de répondre tout à fait autre chose à country. Un objet étant censé être une boite noire, tu ne sais pas ce qu'il s'y passe dedans, tu ne peut pas lui demander une valeur puisque son fonctionnement interne t'es inconnu et il peut très bien s'en moquer de ce que tu lui demande. Concernant ton exemple de code, si askMajority a un soucis et que le fichier n'existe pas, je suppose que tu vas lever une exception non ? Ca veut dire que UserDrinkAllower doit savoir que Country lève une exception, ça veut dire que UserDrinkAllower sait comment marche Country, alors qu'il ne le doit pas le savoir c'est une boite noire. Si tu changes le format de l'exception de Country pour une raison ou une autre, tu vas devoir t'assurer de ne pas casser le code existant qui catch cette exception. Du coup quand tu modifies le fonctionnement interne de Country tu dois t'assurer qu'il continue de marcher avec le monde extérieur et c'est là que l'on voit qu'il y a un couplage fort et que ça rend le code difficile à maintenir et faire évoluer. RE: Compass : East Oriented - srm - 12-05-2015 (25-04-2015, 02:11 PM)Xenos a écrit : 6) Les dépendances circulaires Faut pas le voir comme ça User sait envoyer des messages à Country Country sait envoyer des messages à User C'est pas la même chose, dans le cas ou tu as des getter tu as une dépendance forte oui car tu as forcément un retour d'information. Quand tu envoies un message tu as pas forcément un retour d'information. RE: Compass : East Oriented - srm - 16-05-2015 La conf du PHP Tour : http://estvoyage.github.io/phpTour2015/ RE: Compass : East Oriented - Xenos - 17-05-2015 Non, si le fichier n'est pas accessible, je ne renvoie pas une exception: celle-ci n'est pas dans la signature publique de la méthode. Ce qui rend les codes OO impossible à maintenir, ce sont les changements de signature des méthodes (lorsqu'ils sont anarchiques). Java est bien fichu de ce coté-là (PHP est beaucoup trop souple et permissif pour de l'OO propre): si on veut lever une exception, on doit changer la signature de la méthode. Si on change cette signature, on casse des trucs. Du coup, ma signature n'ayant pas de throws (PHP rattrape le coup avec des commentaires type @throws), je ne peux pas retourner d'exception: uniquement un (int). En cas d'erreur dans le fichier, je retourne un âge qu'il me faut fixer (ben oui, là, j'ai fait de la merde: j'aurai du utiliser un typage de retour différent des typages de base, comme une struct Age par exemple, qui m'aurait permis de gérer des âges du genre NaN; d'ailleurs, je peux toujours utilises l'int NaN en cas d'erreur: je ne casse pas la signature de la méthode). Si je veut insérer la gestion par exception, il me faut une nouvelle méthode, qui dépréciera l'ancienne:
Citation :User sait envoyer des messages à Country Essaie en C++, et tu verras que la dépendance circulaire va vite te les casser (okay, tu peux passer par des forward declarations dans le .hpp mais à force d'inclure des .hpp dans tous les .cpp, la moindre modification de signature d'une classe recompilera le projet entier; ce genre de soucis, j'en sors puisque cette semaine, j'étais à la coupe de France de robotique >.< ). Et oui, je suis d'accord: c'est pour cela que les langages OO ont des signatures de méthodes publiques. Finalement, j'ai plutôt l'impression que East, c'est seulement un doux nom pour tenter de porter les langages évènementiels vers les langages OO (qui n'y sont pas adaptés). Parce que là, du coup, kestananafout des signatures de méthodes finalement? Ranapété. J'en revient au point capital de la combinatoire. Au vue de tes noms de méthodes (UserAskedByCountry par exemple), le pattern générique des noms va ressembler à #AskedBy*. Du coup, supposons que l'on ait 5 requêtes possibles (5 valeurs de #) que peuvent demander 5 classes différents (5 valeurs de *), on va se retrouver avec 25 méthode (et on aura surement cela pour chaque classe...). Sans East, on a 5 requêtes possibles (5 getters), qui peuvent alors être demandés par une infinité de classes. J'ai donc du mal à voir comment la réutilisation de code peut se faire proprement quand les méthodes se nomment "MachinAskedBy[ClassName]" au lieu de "getMachin" (sachant que ce get renvoie un truc qui n'est pas forcément un attribut; et si tel est le cas, il ne devrait être renvoyé que par copie, tout comme l'ADN qui ne sort jamais du noyau d'une cellule). J'attends de voir un projet industriel réalisé en East, et maintenable sur le long terme, car au fond, sans le formaliser, j'en avais fait en stage de dernière année (sous la forme d'un réseau neuronal où chaque noeud est un objet, qui reçoit une copie de tous les messages des autres,le traite ou non et renvoie ou non un message à tous les autres)... Eh bien avec ce genre d'approche, le "je sais ce que je veux et je te fais confiance pour le faire" est vite devenu un "je sais ce que je veux mais mon truc fais n'importe quoi". RE: Compass : East Oriented - srm - 17-05-2015 Ça n'empêche que pour l'exception du coup c'est ton objet A qui doit s'adapter à l'objet B mais bon pourquoi pas. Il n'y a pas de dépendance circulaire car A utilise B mais ne stock aucune référence vers celui-ci. East c'est surtout la POO comme elle a été pensé à l'origine tu devrais lire le lien de la conf que j'ai donné. On invente rien, on rappel ce que c'est la POO à l'origine et pourquoi c'est super intéressant. Il faut déjà qu'il y ai 5 objects différents qui ont besoin de 5 valeurs de A, c'est qui souvent sera du à une mauvaise conception. Pour UserAskedByCountry est un getter c'est la même chose que getUser, alors que non pas du tout. L'avantage du message c'est que tu peux répondre autre chose que ce qui est demandé, tu as la souplesse de faire ce que tu veux. Le mieux c'est de tester avant de critiquer :p RE: Compass : East Oriented - Xenos - 17-05-2015 Citation :sans le formaliser, j'en avais fait en stage de dernière année (sous la forme d'un réseau neuronal où chaque noeud est un objet, qui reçoit une copie de tous les messages des autres,le traite ou non et renvoie ou non un message à tous les autres)... Eh bien avec ce genre d'approche, le "je sais ce que je veux et je te fais confiance pour le faire" est vite devenu un "je sais ce que je veux mais mon truc fais n'importe quoi". :roll: C'était du pure-East (sans forcément avoir mis un nom dessus). Je maintiens (mais t'as peut-être pas fais de C++ pour le voir?) que si tu utilises A dans B, tu te trouves obligé d'au moins déclarer que A est une classe (forward declaration) avant de déclarer B (et inversement). C'est pas la mort, mais cela rajoutes du code. Ce qui pose soucis, c'est que chaque objet ayant une demande à faire à une classe doit (au vu du UserAskedByMachin) implique de créer une nouvelle méthode... Ou alors, de passer par une interface (Machin), que chaque demandeur doit implémenter. C'est jouable, mais cela m'a l'air de juste transferer la signature de chaque méthode dans une interface dédiée. C'est peut-être un rappel de la POO à l'origine, mais je trouve surtout que c'est "sur-fait" car le problème est plus dans l'interprétation d'un appel de méthode ("le getter renvoie la valeur de mon attribut") que dans son utilisation ("le getter me renvoie l'âge de l'utilisateur, 'm'en fous d'où il sort: c'est ce que je veux, son âge"). Pour faire de l'OO pur sans se briser les doigts, il suffit finalement de lire les Class::appelant { $chose = $object->methodName($parameters) } comme l'envoie d'un message à $object composé de l'émetteur, la méthode, les paramètres, le conteneur de résultat: {$appelant, methodName, $parameters...} puis l'arrêt de l'exécution de l'appelant, après avoir sauvé son état courant et Class::methodName { return $result; } comme Je traite le message {$appelant, methodName, $parameters...} et une fois terminé, j'envoie un message spécial au $appelant, type {$object, null, $result}. Quand $appelant reçoit ce message, il se remet dans l'état qu'il avait sauvé et récupère $result.. Perso, cela me parait bien moins prise de tête... C'est d'ailleurs ce que l'ordinateur fait (il me semble). Bref, je n'adhère pas (que ce soit du Alan Kay ou non), car cela émule ce que la machine fait déjà intrinsèquement. Mieux vaut se contenter de bien respecter les signatures des méthodes et de ne pas les casser lors des évolutions. RE: Compass : East Oriented - srm - 17-05-2015 Tant pis tu ne veux pas essayer RE: Compass : East Oriented - srm - 18-05-2015 C'est toujours pareil de toute façon, si tu fais un getter, tu consisdères que l'objet sur lequel tu get n'a pas son mot à dire et qu'il ne peut que te retourner la valeur que tu lui demande. Et tu considères que tu sais mieux que lui qu'il peut te donner la valeur que tu demandes car tu lui impose de te la donner. Et c'est là le drame, car tout ce postula est forcément faux. Si tu ne vois pas pourquoi je t'invite à lire https://thesecretsquad.wordpress.com/2014/10/25/dazed-and-confuzzled/ Qui l'explique très bien RE: Compass : East Oriented - srm - 18-05-2015 Et je t'invite aussi à lire ça : https://www.reussitepersonnelle.com/zone-confort/ C'est instructif |