{"id":2525,"date":"2026-05-27T18:12:53","date_gmt":"2026-05-27T17:12:53","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2525"},"modified":"2026-05-27T18:15:59","modified_gmt":"2026-05-27T17:16:00","slug":"mogwai-8-7-identifiants-ordonnes-introspection-oop-et-processus-externes","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2525","title":{"rendered":"MOGWAI 8.7 : identifiants ordonn\u00e9s, introspection OOP et processus externes"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">La version 8.7 de<a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\"> MOGWAI<\/a> vient d&rsquo;\u00eatre publi\u00e9e sur <a href=\"https:\/\/www.nuget.org\/packages\/MOGWAI\" target=\"_blank\" rel=\"noreferrer noopener\">NuGet<\/a>. Cette version n&rsquo;introduit pas de changement architectural majeur \u2014 elle consolide et enrichit ce qui existe d\u00e9j\u00e0, avec quatre nouvelles primitives couvrant des besoins bien distincts, et deux corrections importantes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00ab\u00a0guid7\u00a0\u00bb des identifiants vraiment ordonn\u00e9s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MOGWAI proposait d\u00e9j\u00e0 <code>guid<\/code> pour g\u00e9n\u00e9rer des UUID v4. La v8.7 ajoute <code>guid7<\/code>, bas\u00e9 sur la sp\u00e9cification UUID v7.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La diff\u00e9rence est importante : un UUID v4 est purement al\u00e9atoire. Un UUID v7 encode les 48 premiers bits avec l&rsquo;horodatage Unix en millisecondes, ce qui le rend <strong>monotoniquement croissant<\/strong>. Concr\u00e8tement, deux appels successifs \u00e0 <code>guid7<\/code> produiront toujours des valeurs tri\u00e9es dans le bon ordre.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">guid7 -&gt; '$id'<br>$id ?   # \u2192 \"4843BAB6-6A90-4138-AC9F-DB7ABE0018CB\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est un d\u00e9tail qui change beaucoup en pratique : les bases de donn\u00e9es relationnelles indexent beaucoup plus efficacement des cl\u00e9s primaires ordonn\u00e9es. Si vous utilisez MOGWAI dans un contexte o\u00f9 les identifiants alimentent une base de donn\u00e9es, <code>guid7<\/code> est le bon choix.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Introspection OOP : \u00ab\u00a0isAlive\u00a0\u00bb et \u00ab\u00a0frame\u00a0\u00bb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le syst\u00e8me de classes introduit en v8.6 s&rsquo;enrichit de trois primitives d&rsquo;introspection qui permettent d&rsquo;interroger l&rsquo;\u00e9tat du moteur \u00e0 l&rsquo;ex\u00e9cution.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00ab\u00a0isAlive\u00a0\u00bb : v\u00e9rifier qu&rsquo;une r\u00e9f\u00e9rence est encore valide<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Quand une instance est lib\u00e9r\u00e9e via <code>free<\/code>, toute variable qui en conservait la r\u00e9f\u00e9rence devient invalide. <code>isAlive<\/code> permet de tester cet \u00e9tat sans risquer d&rsquo;erreur \u2014 elle retourne simplement <code>true<\/code> ou <code>false<\/code>, quelles que soient les circonstances.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if ($U1 isAlive) then<br>{<br>    $U1->display:<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est le compl\u00e9ment naturel de <code>isEmpty<\/code> et <code>isNull<\/code> pour \u00e9crire du code d\u00e9fensif propre.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00ab\u00a0alive\u00a0\u00bb : lister toutes les instances actives<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>alive<\/code> retourne la liste de toutes les r\u00e9f\u00e9rences <code>.objref<\/code> actuellement vivantes dans le moteur. Combin\u00e9e \u00e0 <code>foreach...filter<\/code>, elle permet des requ\u00eates tr\u00e8s expressives :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># R\u00e9cup\u00e9rer toutes les instances d'une classe donn\u00e9e<br>alive foreach 'item' filter { item->className: 'User' == } -> '$users'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est utile pour le d\u00e9bogage, mais aussi pour des patterns de gestion de ressources o\u00f9 l&rsquo;on souhaite inspecter ou lib\u00e9rer l&rsquo;ensemble des instances d&rsquo;un type.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00ab\u00a0frame\u00a0\u00bb : inspecter la structure d&rsquo;une classe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>frame<\/code> prend un nom de classe et retourne un record d\u00e9crivant sa structure compl\u00e8te : propri\u00e9t\u00e9s publiques et priv\u00e9es avec leurs types d\u00e9clar\u00e9s, m\u00e9thodes publiques et priv\u00e9es.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">'Counter' frame ?<br><br># \u2192 [className: 'Counter' props: [value: .number] _props: [_step: .number] funcs: (onInit: increment: reset:) _funcs: ()]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est une primitive de m\u00e9taprogrammation l\u00e9g\u00e8re qui ouvre la porte \u00e0 des outils d&rsquo;inspection, de g\u00e9n\u00e9ration de code ou de s\u00e9rialisation g\u00e9n\u00e9rique bas\u00e9s sur la structure des classes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00ab\u00a0process.exec\u00a0\u00bb : lancer un processus et capturer sa sortie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>process.exec<\/code> compl\u00e8te <code>process.start<\/code> avec un comportement bloquant : elle lance un processus externe, attend sa fin, et pousse sur la pile un record contenant le code de retour, le contenu de <code>stdout<\/code> et le contenu de <code>stderr<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[filename: \"dotnet\" arguments: \"--version\"] process.exec -&gt; '$r'<br>$r status: get ?   # 0<br>$r output: get ?   # \"10.0.203\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il est \u00e9galement possible d&rsquo;envoyer des donn\u00e9es sur l&rsquo;entr\u00e9e standard du processus via la cl\u00e9 <code>input:<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[filename: \"myservice.exe\" input: \"42\"] process.exec -&gt; '$r'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Les deux flux sont lus en parall\u00e8le pour \u00e9viter les deadlocks de buffer \u2014 un probl\u00e8me classique avec les wrappers de processus na\u00effs. <code>process.exec<\/code> est particuli\u00e8rement utile dans les scripts d&rsquo;automatisation ou d&rsquo;int\u00e9gration, o\u00f9 MOGWAI orchestre des outils externes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Corrections<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Deux bugs ont \u00e9t\u00e9 corrig\u00e9s dans cette version.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>free<\/code> avec <code>onFree:<\/code> d\u00e9fini.<\/strong> Lorsqu&rsquo;une classe d\u00e9finissait un hook <code>onFree:<\/code>, appeler <code>free<\/code> ex\u00e9cutait correctement le hook, mais l&rsquo;instance n&rsquo;\u00e9tait pas retir\u00e9e du registre interne. Elle restait donc accessible, et <code>isAlive<\/code> retournait incorrectement <code>true<\/code> apr\u00e8s la lib\u00e9ration. C&rsquo;est d\u00e9sormais corrig\u00e9 dans tous les cas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>R\u00e9initialisation du runtime.<\/strong> Lors d&rsquo;un reset du moteur, la pile n&rsquo;\u00e9tait pas vid\u00e9e correctement. Ce bug pouvait laisser des valeurs r\u00e9siduelles dans un \u00e9tat qui devait \u00eatre propre.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">En r\u00e9sum\u00e9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MOGWAI 8.7 est une version de consolidation cibl\u00e9e. <code>guid7<\/code> r\u00e9pond \u00e0 un besoin concret des applications orient\u00e9es base de donn\u00e9es. Les trois primitives OOP transforment le syst\u00e8me de classes en un syst\u00e8me v\u00e9ritablement introspectable. <code>process.exec<\/code> ouvre MOGWAI aux sc\u00e9narios d&rsquo;automatisation et d&rsquo;int\u00e9gration syst\u00e8me. Et les deux corrections r\u00e9solvent des comportements incorrects qui auraient pu \u00eatre difficiles \u00e0 diagnostiquer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La version 8.7 est disponible d\u00e8s maintenant sur <a href=\"https:\/\/www.nuget.org\/packages\/MOGWAI\" target=\"_blank\" rel=\"noreferrer noopener\">NuGet<\/a> et sur <a href=\"https:\/\/github.com\/Sydney680928\/mogwai\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La version 8.7 de MOGWAI vient d&rsquo;\u00eatre publi\u00e9e sur NuGet. Cette version n&rsquo;introduit pas de changement architectural majeur \u2014 elle consolide et enrichit ce qui existe d\u00e9j\u00e0, avec quatre nouvelles primitives couvrant des besoins bien distincts, et deux corrections importantes. \u00ab\u00a0guid7\u00a0\u00bb des identifiants vraiment ordonn\u00e9s MOGWAI proposait d\u00e9j\u00e0 guid pour g\u00e9n\u00e9rer des UUID v4. La &#8230; <a title=\"MOGWAI 8.7 : identifiants ordonn\u00e9s, introspection OOP et processus externes\" class=\"read-more\" href=\"https:\/\/coding4phone.com\/?p=2525\" aria-label=\"En savoir plus sur MOGWAI 8.7 : identifiants ordonn\u00e9s, introspection OOP et processus externes\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":337,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez MOGWAI 8.7 : nouvelles primitives, introspection OOP, et am\u00e9liorations majeures pour une int\u00e9gration facilit\u00e9 sur NuGet.","jetpack_seo_html_title":"MOGWAI 8.7 : Nouvelles fonctionnalit\u00e9s et corrections cl\u00e9s","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[8,1,6,48,50],"tags":[],"class_list":["post-2525","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-uncategorized","category-mogwai","category-rpn","category-scripting"],"jetpack_publicize_connections":[],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-EJ","jetpack-related-posts":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2023\/10\/mogwai_img6.png?fit=251%2C200&ssl=1","_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2525"}],"version-history":[{"count":13,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2525\/revisions"}],"predecessor-version":[{"id":2548,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2525\/revisions\/2548"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/337"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}