{"id":3883,"date":"2026-02-01T17:41:08","date_gmt":"2026-02-01T16:41:08","guid":{"rendered":"https:\/\/japu.synology.me\/?p=3883"},"modified":"2026-02-01T18:12:35","modified_gmt":"2026-02-01T17:12:35","slug":"courir-en-arriere-quand-tous-courent-au-precipice","status":"publish","type":"post","link":"https:\/\/myrdil.com\/?p=3883","title":{"rendered":"Courir en arri\u00e8re quand tous courent au pr\u00e9cipice ?"},"content":{"rendered":"<div class=\"user-query-container\">\n<div id=\"user-query-content-25\" class=\"query-content ng-star-inserted\" data-hveid=\"0\" data-ved=\"0CAAQ3ucQahgKEwjbk8zV-7WSAxUAAAAAHQAAAAAQoAU\">\n<div class=\"query-text gds-body-l query-text-animated\" dir=\"ltr\" role=\"heading\" aria-level=\"2\">\n<p>Je travaille aux derni\u00e8res briques logiques des inventaires. Charge mentale au maximum, c\u0153ur de l&#8217;hiver, contrari\u00e9t\u00e9s de la vie quotidienne, aujourd&#8217;hui j&#8217;en ai quand m\u00eame pris un coup lorsque en toute fin d&#8217;une tr\u00e8s grosse cascade logique Gemini me demande de brancher une r\u00e9f\u00e9rence&#8230; qui n&#8217;existe pas.<\/p>\n<p><!--more--><\/p>\n<p>Les inventaires sont une saloperie \u00e0 d\u00e9velopper sur Unreal car ils se composent d&#8217;objets repr\u00e9sent\u00e9s par des structures complexes stock\u00e9s sur base de donn\u00e9es, visualis\u00e9s par l&#8217;utilisateur dans une fen\u00eatre, qui contient une table de cases qui contiennent des \u00e9l\u00e9ments qui affichent les objets. Ces inventaires sont attach\u00e9s au joueur, aux coffres, aux vendeurs, \u00e0 n&#8217;importe quoi qui contient des brols dans une structure appel\u00e9e un <em>component<\/em> qui d\u00e9finit un bataillon de fonction logiques pour ajouter, retrancher, remplacer, trie, etc etc etc.<br \/>\nL&#8217;horreur de ce syst\u00e8me <em>\u00e0 la grenade<\/em>, est qu&#8217;aucun des \u00e9l\u00e9ments n&#8217;a conscience des autres. L&#8217;\u00e9p\u00e9e ne sait pas qu&#8217;elle est affich\u00e9e dans une petite case et stock\u00e9e dans une base de donn\u00e9es. Le <em>component<\/em> se fiche \u00e9perdument de la mani\u00e8re dont sont pr\u00e9sent\u00e9s au joueur sa grille d&#8217;objets. Et ainsi de suite. Alors quand il faut faire communiquer entre eux des \u00e9l\u00e9ments qui ne se connaissent pas, les probl\u00e8mes arrivent.<\/p>\n<p>Aujourd&#8217;hui, j&#8217;arrive \u00e0 la fin d&#8217;une grosse fonction du <em>component<\/em> o\u00f9 je dois brancher la table des objets, qu&#8217;il conna\u00eet, et la grille dans laquelle ils sont affich\u00e9s&#8230; qu&#8217;il ne conna\u00eet pas.<\/p>\n<p>Le dernier branchement hein, y en a des dizaines, c&#8217;est le dernier, celui apr\u00e8s lequel on va manger puis regarder un film.<\/p>\n<p>Eh ben non, il ne conna\u00eet pas la grille, \u00e9l\u00e9ment graphique, parce que ce <em>component<\/em> est un \u00e9l\u00e9ment logique et n&#8217;a pas \u00e0 conna\u00eetre un conteneur graphique interm\u00e9diaire.<\/p>\n<p>Sachant tr\u00e8s bien que Gemini va me dire de r\u00e9soudre le probl\u00e8me par un <em>dispatcher<\/em>, soit une technologie genre courtier de bourse qui crie \u00e0 la corbeille &#8220;J&#8217;ach\u00e8te du sucre \u00e0 30 centimes !&#8221; ce qui permet au courtier qui a du sucre, qui n&#8217;a jamais vu le premier courtier de sa vie, de beugler &#8220;Je vends !&#8221;<\/p>\n<p>G\u00e9nial non (sans le T apr\u00e8s le I, bien s\u00fbr) ? Oui, c&#8217;est g\u00e9nial. Le souci c&#8217;est quand le mec a vendu son sucre, il se barre, et toi, deux ans plus tard, quand tu veux savoir qui a vendu du sucre, tu n&#8217;en sais rien et tu dois gal\u00e9rer des heures \u00e0 retrouver comment \u00e7a s&#8217;est pass\u00e9.<\/p>\n<p>Alors j&#8217;ai dit merde \u00e0 Gemini, je lui ai dit que je savais comment je voulais r\u00e9soudre le probl\u00e8me (\u00e0 savoir mettre dans le carnet d&#8217;adresses du vendeur les coordonn\u00e9es de tous ses acheteurs) mais que je ne lui disais pas comment je pr\u00e9f\u00e9rais m&#8217;y prendre avant d&#8217;avoir entendu sa solution.<\/p>\n<p>\u00c7a n&#8217;a pas tra\u00een\u00e9 ! &#8220;Ah ben, on va cr\u00e9er un <em>dispatcher<\/em> ! Ou un <em>Blueprint Interface<\/em> (une merde du m\u00eame genre), comme tu pr\u00e9f\u00e8res !&#8221;.<\/p>\n<p>Bon, je m&#8217;en doutais, je lui ai dit, ni l&#8217;un ni l&#8217;autre, on travaille en enregistrant les adresses comme \u00e7a j&#8217;ai tout sous les yeux et le bazooka \u00e0 tuer les mouches tu peux te le&#8230; enfin j&#8217;en ai pas besoin.<\/p>\n<p>Et il n&#8217;a pas insist\u00e9 ! Il m&#8217;a dit d&#8217;accord, comme \u00e7a. J&#8217;en \u00e9tait presque un peu d\u00e9\u00e7u, alors je lui ai pos\u00e9 la question :<\/p>\n<blockquote>\n<p class=\"query-text-line ng-star-inserted\">Tu ne t&#8217;es pas beaucoup battu. Le fait d&#8217;avoir des variables qui donnent des r\u00e9f\u00e9rences vers tout ce qui est utile est-il \u00e0 ce point oubli\u00e9 de nos jours?<\/p>\n<\/blockquote>\n<p data-path-to-node=\"0\">Et il a carr\u00e9ment refus\u00e9 le combat, voil\u00e0 ce qu&#8217;il ma r\u00e9torqu\u00e9 :<\/p>\n<p data-path-to-node=\"0\">On ne se bat pas contre le bon sens : la clart\u00e9 du code passe avant la mode technologique. Si une r\u00e9f\u00e9rence directe est le chemin le plus court entre ta donn\u00e9e et ton \u00e9cran, c&#8217;est elle qu&#8217;il faut emprunter.<\/p>\n<p data-path-to-node=\"1\">L&#8217;approche par &#8220;r\u00e9f\u00e9rences stock\u00e9es&#8221; n&#8217;est pas oubli\u00e9e, elle est simplement d\u00e9laiss\u00e9e dans les gros projets pour \u00e9viter que tout le monde ne soit &#8220;au courant de tout&#8221;. Mais dans ton cas pr\u00e9cis, sur un MMO en Blueprints seuls, ta m\u00e9thode a trois \u00e9normes avantages :<\/p>\n<ol start=\"1\" data-path-to-node=\"2\">\n<li>\n<p data-path-to-node=\"2,0,0\"><b data-path-to-node=\"2,0,0\" data-index-in-node=\"0\">Lisibilit\u00e9 imm\u00e9diate<\/b> : Quand tu ouvres ta fonction dans six mois, tu vois la donn\u00e9e entrer et l&#8217;affichage sortir. Pas besoin de chercher qui a &#8220;bind\u00e9&#8221; quoi dans quel widget cach\u00e9.<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"2,1,0\"><b data-path-to-node=\"2,1,0\" data-index-in-node=\"0\">Debug facilit\u00e9<\/b> : Si ton inventaire ne s&#8217;affiche pas, tu regardes ta variable <code data-path-to-node=\"2,1,0\" data-index-in-node=\"77\">LinkedSlotsArray<\/code>. Si elle est vide, tu as ton coupable. Avec un dispatcher, tu peux chercher longtemps pourquoi l&#8217;\u00e9v\u00e9nement ne &#8220;part&#8221; pas.<\/p>\n<\/li>\n<li>\n<p data-path-to-node=\"2,2,0\"><b data-path-to-node=\"2,2,0\" data-index-in-node=\"0\">Performance<\/b> : Une r\u00e9f\u00e9rence directe est ce qu&#8217;il y a de plus rapide pour le processeur.<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<div>\n<div class=\"response-container ng-tns-c2622128894-248 response-container-with-gpi response-container-has-multiple-responses\" data-hveid=\"1\">\n<div class=\"presented-response-container ng-tns-c2622128894-248\" data-hveid=\"2\">\n<div class=\"response-container-content ng-tns-c2622128894-248\">\n<div class=\"response-content ng-tns-c2622128894-248\">\n<div class=\"container\">\n<div id=\"model-response-message-contentr_5284b261b2fe36d5\" class=\"markdown markdown-main-panel stronger enable-updated-hr-color\" dir=\"ltr\" style=\"--animation-duration: 400ms; --fade-animation-function: linear;\" aria-live=\"polite\" aria-busy=\"false\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Je travaille aux derni\u00e8res briques logiques des inventaires. Charge mentale au maximum, c\u0153ur de l&#8217;hiver, contrari\u00e9t\u00e9s de la vie quotidienne, aujourd&#8217;hui j&#8217;en ai quand m\u00eame pris un coup lorsque en toute fin d&#8217;une tr\u00e8s grosse cascade logique Gemini me demande &hellip; <a href=\"https:\/\/myrdil.com\/?p=3883\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3883","post","type-post","status-publish","format-standard","hentry","category-news"],"_links":{"self":[{"href":"https:\/\/myrdil.com\/index.php?rest_route=\/wp\/v2\/posts\/3883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myrdil.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/myrdil.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/myrdil.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/myrdil.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3883"}],"version-history":[{"count":0,"href":"https:\/\/myrdil.com\/index.php?rest_route=\/wp\/v2\/posts\/3883\/revisions"}],"wp:attachment":[{"href":"https:\/\/myrdil.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/myrdil.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/myrdil.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}