{"id":601,"date":"2016-12-27T19:10:18","date_gmt":"2016-12-27T17:10:18","guid":{"rendered":"http:\/\/www.loicmathieu.fr\/wordpress\/?p=601"},"modified":"2016-12-29T12:19:11","modified_gmt":"2016-12-29T10:19:11","slug":"le-pattern-de-specification-et-les-lambdas","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/le-pattern-de-specification-et-les-lambdas\/","title":{"rendered":"Le pattern de specification et les lambdas"},"content":{"rendered":"<h2>\u00a0Introduction : le pattern de sp\u00e9cification<\/h2>\n<p>J&rsquo;ai r\u00e9cemment mis en place le pattern de sp\u00e9cification pour g\u00e9rer des r\u00e8gles m\u00e9tier au sein d&rsquo;une de nos application. Je me suis inspir\u00e9 du tr\u00e8s bon article suivant trouv\u00e9 sur le bog de Xebia :\u00a0<a href=\"http:\/\/blog.xebia.fr\/2009\/12\/29\/le-pattern-specification-pour-la-gestion-de-vos-regles-metier\"><a href=\"http:\/\/blog.xebia.fr\/2009\/12\/29\/le-pattern-specification-pour-la-gestion-de-vos-regles-metier\">http:\/\/blog.xebia.fr\/2009\/12\/29\/le-pattern-specification-pour-la-gestion-de-vos-regles-metier<\/a><\/a>\/ cet article, bien qu&rsquo;ancien (7 ans!) est toujours d&rsquo;actualit\u00e9. Il est lui-m\u00eame inspir\u00e9 du pattern tel que d\u00e9crit par Martin Fowler ici :\u00a0<a href=\"http:\/\/www.martinfowler.com\/apsupp\/spec.pdf\"><a href=\"http:\/\/www.martinfowler.com\/apsupp\/spec.pdf\">http:\/\/www.martinfowler.com\/apsupp\/spec.pdf<\/a><\/a><\/p>\n<p>Je ne vais pas vous faire la description compl\u00e8te du pattern (si vous ne le connaissez pas je vous conseille viement de lire l&rsquo;article de Xebia), son principe est de s\u00e9parer chaque r\u00e8gle m\u00e9tier dans une classe donn\u00e9es (une sp\u00e9cification) et de pouvoir les composer avec des and, or et not pour am\u00e9liorer la lisibilit\u00e9 des r\u00e8gles m\u00e9tiers.<\/p>\n<p>Mais l&rsquo;article de Xebia est tr\u00e8s ancien, il date d&rsquo;un monde avant Java 8, avant les lambdas et la programation fonctionnelle qu&rsquo;elles permettent.<\/p>\n<p>Je vous propose donc ici de revisiter ce pattern avec l&rsquo;introduction des lambdas!<\/p>\n<p>Voici un exemple de r\u00e8gles m\u00e9tier basique que nous allons transformer via ce pattern pour en accroitre la lisibilit\u00e9 et la r\u00e9utilisabilit\u00e9 :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nObj1 obj1 = new Obj1();\/\/init\nboolean isSatisfied = obj.getText() != null &amp;&amp; (obj.getNb() &gt; 10 || obj.getNb() &lt; 1);\n<\/pre>\n<h2>Le pattern de sp\u00e9cification sans lambda<\/h2>\n<p>Voici un diagramme du pattern de sp\u00e9cification originel tel que d\u00e9fini dans l&rsquo;article du blog de Xebia et qui pr\u00e9sente les classes suivantes :<\/p>\n<ul><li>Une interface <strong>Specification<\/strong> qui d\u00e9finit la m\u00e9thode <strong>isSatisfiedBy(T obj)<\/strong> qui contient la r\u00e8gle de gestion en question et les m\u00e9thodes <strong>and()<\/strong>, <strong>or()<\/strong>, <strong>not()<\/strong> permettant la composition de sp\u00e9cification<\/li>\n\n<li>Une classe abstraire <strong>AbstractCompositeSpecification<\/strong> qui impl\u00e9mente l&rsquo;interface Specification\u00a0et ses m\u00e9thodes <strong>and()<\/strong>, <strong>or()<\/strong>, <strong>not()<\/strong> via les classes concr\u00e8tes suivantes :\n<ul><li><strong>AndSpecification<\/strong> : composition de sp\u00e9cification via ET logique<\/li>\n\n<li><strong>OrSpecification<\/strong> : composition de sp\u00e9cification via OU logique<\/li>\n\n<li><strong>NotSpecification<\/strong> : composition de sp\u00e9cification via NON logique<\/li>\n<\/ul><\/li>\n\n<li>Une class abstraite <strong>LeafSpecification<\/strong> qui sert de marqueur pour l&rsquo;impl\u00e9mentation de nos sp\u00e9cifications. Chaque sp\u00e9cification que nous impl\u00e9menterons devra \u00e9tendre cette classe (ex par exemple de la classe <strong>MySpecification<\/strong> dans le schema) et impl\u00e9menter la m\u00e9thode <strong>isSatisfiedBy(T obj)<\/strong><\/li>\n<\/ul>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-606\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/SpecificationPattern-1024x506.png?resize=640%2C316\" alt=\"specificationpattern\" width=\"640\" height=\"316\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/SpecificationPattern.png?resize=1024%2C506&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/SpecificationPattern.png?resize=300%2C148&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/SpecificationPattern.png?resize=768%2C380&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/SpecificationPattern.png?w=1199&amp;ssl=1 1199w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<p>Voici un exemple d&rsquo;impl\u00e9mentation en Java :\u00a0<a href=\"https:\/\/github.com\/loicmathieu\/dojo\/tree\/master\/src\/main\/java\/fr\/loicmathieu\/dojo\/pattern\/specification\"><a href=\"https:\/\/github.com\/loicmathieu\/dojo\/tree\/master\/src\/main\/java\/fr\/loicmathieu\/dojo\/pattern\/specification\">https:\/\/github.com\/loicmathieu\/dojo\/tree\/master\/src\/main\/java\/fr\/loicmathieu\/dojo\/pattern\/specification<\/a><\/a><\/p>\n<p>L&rsquo;impl\u00e9mentation du\u00a0pattern avec trois sp\u00e9cifications basiques :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class Obj1HasNotNullText extends LeafSpecification{\n  @Override\n  public boolean isSatisfiedBy(Obj1 obj) {\n    return obj.getText() != null;\n  }\n}\n\npublic class Obj1NbLessThan1 extends LeafSpecification {\n  @Override\n  public boolean isSatisfiedBy(Obj1 obj) {\n    return obj.getNb() &lt; 1;\n  }\n}\n\npublic class Obj1NbMoreThan10 extends LeafSpecification {\n  @Override\n  public boolean isSatisfiedBy(Obj1 obj) {\n    return obj.getNb() &gt; 10;\n  }\n}\n<\/pre>\n<p>Et leurs utilisation :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nObj1 obj1 = new Obj1();\/\/init\nObj1HasNotNullText spec1 = new Obj1HasNotNullText();\nObj1NbMoreThan10 spec2 = new Obj1NbMoreThan10();\nObj1NbLessThan1 spec3 = new Obj1NbLessThan1();\n\nboolean isSatisfied = spec1.and(spec2.or(spec3)).isSatisfiedBy(obj1);\n<\/pre>\n<h2>Le pattern de sp\u00e9cification avec lambda<\/h2>\n<p>Dans l&rsquo;exemple pr\u00e9c\u00e9dent, on voit bien que lorsque les r\u00e8gles sont basiques, la cr\u00e9ation de classes d\u00e9di\u00e9es\u00a0est fastitieuse. Essayons donc de modifier le pattern afin que l&rsquo;on puisse utiliser des lambdas pour l&rsquo;impl\u00e9mentation de nos sp\u00e9cifications.<\/p>\n<p>Pour pouvoir d\u00e9finir une sp\u00e9cification via une lambda, il faut que l&rsquo;interface <strong>Specification<\/strong> deviennent une interface fonctionnelle : une interface avec uniquement une seule m\u00e9thode (voir <a href=\"http:\/\/FunctionalInterface\"><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/FunctionalInterface.html\">https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/FunctionalInterface.html<\/a><\/a>\u00a0pour plus d&rsquo;informations). On va donc extraire dans une interface <strong>CompositeSpecification<\/strong> les m\u00e9thodes de compositions de sp\u00e9cification (<strong>and()<\/strong>, <strong>or()<\/strong>, <strong>not()<\/strong>) et ne laisser uniquement que dans l&rsquo;interface Specification la m\u00e9thode <strong>isSatisfiedy(T obj)<\/strong> qui pourra maintenant donc \u00eatre impl\u00e9ment\u00e9e via une lambda.<\/p>\n<p>Mais la question est : comment d\u00e9finir cette lambda, il nous faudrait une sorte de factory quelque part? J&rsquo;ai choisit d&rsquo;ajouter une m\u00e9thode statique <strong>from(Specification spec)<\/strong> \u00e0 la classe abstraite\u00a0<strong>LeafSpecification<\/strong> qui pemet de cr\u00e9er une sp\u00e9cification depuis une lambda, c&rsquo;est l\u00e0 que tout se passe et voici comment \u00e7a marche :<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic abstract class LeafSpecification extends AbstractCompositeSpecification{\n\n  public static  LeafSpecification from(Specification spec){\n    return new LambdaSpecification(spec);\n  }\n\n   static class LambdaSpecification extends LeafSpecification {\n     private Specification s;\n\n     LambdaSpecification(Specification s){\n       this.s = s;\n     }\n\n     public boolean isSatisfiedBy(T obj) {\n       return s.isSatisfiedBy(obj);\n     }\n  }\n}\n<\/pre>\n<p><span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif\">J&rsquo;ai donc cr\u00e9\u00e9 une classe interne <\/span>\n<strong style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif\">LambdaSpecification<\/strong>\n<span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif\"> qui impl\u00e8mente\u00a0<\/span>\n<strong style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif\">isSatisfiedBy(T obj)<\/strong>\n<span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif\"> via une sp\u00e9cification pass\u00e9 lors de la construction de la classe &#8230; et voila ! On peut maintenant cr\u00e9er des sp\u00e9cification facilement depuis une lambda via :<\/span><\/p>\n<pre>Specification spec = LeafSpecification.from(obj -&gt; obj.size() &gt; 10);<\/pre>\n<p>Voici le diagramme de classe modifi\u00e9 :<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-607\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/LambdaSpecification-1024x601.png?resize=640%2C376\" alt=\"lambdaspecification\" width=\"640\" height=\"376\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/LambdaSpecification.png?resize=1024%2C601&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/LambdaSpecification.png?resize=300%2C176&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/LambdaSpecification.png?resize=768%2C451&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/LambdaSpecification.png?w=1199&amp;ssl=1 1199w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<p>Voici\u00a0un exemple d&rsquo;impl\u00e9mentation en Java : <a href=\"https:\/\/github.com\/loicmathieu\/dojo\/tree\/master\/src\/main\/java\/fr\/loicmathieu\/dojo\/pattern\/lambdaspec\"><a href=\"https:\/\/github.com\/loicmathieu\/dojo\/tree\/master\/src\/main\/java\/fr\/loicmathieu\/dojo\/pattern\/lambdaspec\">https:\/\/github.com\/loicmathieu\/dojo\/tree\/master\/src\/main\/java\/fr\/loicmathieu\/dojo\/pattern\/lambdaspec<\/a><\/a><\/p>\n<p>L&rsquo;impl\u00e9mentation du\u00a0pattern avec trois sp\u00e9cifications basiques et son utilisation (ici, plus besoin de cr\u00e9er de classes s\u00e9par\u00e9s pour les sp\u00e9cifications):<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\nObj1 obj1 = new Obj1();\/\/init\nLeafSpecification spec1 = LeafSpecification.from(obj -&gt; obj.getText() != null);\nLeafSpecification spec2 = LeafSpecification.from(obj -&gt; obj.getNb() &gt; 10);\nLeafSpecification spec3 = LeafSpecification.from(obj -&gt; obj.getNb() &lt; 1);\n\nboolean isSatisfied = spec1.and(spec2.or(spec3)).isSatisfiedBy(obj1);\n<\/pre>\n<h2>Conclusion<\/h2>\n<p>L&rsquo;utilisation des lambdas pour impl\u00e9menter le pattern de sp\u00e9cification semble un ajout int\u00e9r\u00e9ssant. Mais attention, il est int\u00e9r\u00e9ssant dans le cadre de sp\u00e9cifications basiques tenant sur un ensemble de lignes r\u00e9duites (voir uniquement pour des sp\u00e9cifications \u00e0 une ligne?). Le mieux \u00e9tant de mixer des sp\u00e9cifications en lambda avec des sp\u00e9cifications impl\u00e9ment\u00e9e de mani\u00e8re <strong><em>classiques<\/em> <\/strong>quand elles repr\u00e9sentent des r\u00e8gles m\u00e9tier complexes pour ne pas aller \u00e0 l&rsquo;encontre de pourquoi le pattern de sp\u00e9cification a \u00e9t\u00e9 cr\u00e9er \u00e0 la base (lisibilit\u00e9 du code entre autre).<\/p>\n<p>On peut d&rsquo;ailleur se poser la question de savoir si l&rsquo;impl\u00e9mentation en lambda du pattern de sp\u00e9cification ne serait pas en elle-m\u00eame un anti-pattern car on r\u00e9-\u00e9crit alors toutes les r\u00e8gles m\u00e9tier directement dans la classe les utilisant sans pouvoir les r\u00e9-utiliser dans d&rsquo;autre classes &#8230; je vous laisse le soin de juger ;).<\/p>","protected":false},"excerpt":{"rendered":"<p>\u00a0Introduction : le pattern de sp\u00e9cification J&rsquo;ai r\u00e9cemment mis en place le pattern de sp\u00e9cification pour g\u00e9rer des r\u00e8gles m\u00e9tier au sein d&rsquo;une de nos application. Je me suis inspir\u00e9 du tr\u00e8s bon article suivant trouv\u00e9 sur le bog de Xebia :\u00a0<a href=\"http:\/\/blog.xebia.fr\/2009\/12\/29\/le-pattern-specification-pour-la-gestion-de-vos-regles-metier\/\">http:\/\/blog.xebia.fr\/2009\/12\/29\/le-pattern-specification-pour-la-gestion-de-vos-regles-metier\/<\/a> cet article, bien qu&rsquo;ancien (7 ans!) est toujours d&rsquo;actualit\u00e9. Il est lui-m\u00eame inspir\u00e9 du pattern tel que d\u00e9crit par Martin Fowler ici :\u00a0<a href=\"http:\/\/www.martinfowler.com\/apsupp\/spec.pdf\">http:\/\/www.martinfowler.com\/apsupp\/spec.pdf<\/a> Je ne vais pas vous faire la description compl\u00e8te du pattern (si vous ne le&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/le-pattern-de-specification-et-les-lambdas\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[17,11,155],"class_list":["post-601","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-design-pattern","tag-java","tag-lambda"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":391,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/chti-jug-drools-v5-et-drools-planner\/","url_meta":{"origin":601,"position":0},"title":"Ch&rsquo;ti Jug: Drools v5 et Drools Planner","author":"admin","date":"samedi 13 f\u00e9vrier 2010","format":false,"excerpt":"Jeudi 21 janvier s'est tenu dans les locaux de l'Universit\u00e9 de Lille 1 une session du Ch'ti Jug sponsoris\u00e9e par Cylande sur Drools:\u00a0 Drools, avec Cylande et l'Universit\u00e9 Lille 1 Pour ceux qui ne savent pas ce qu'est le Ch'ti Jug ou ce qu'est un Jug, voir l'introduction de mon\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":39,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/sitemesh-gerer-son-layout-sans-douleur\/","url_meta":{"origin":601,"position":1},"title":"Sitemesh : g\u00e9rer son layout sans douleur","author":"admin","date":"vendredi  6 juillet 2007","format":false,"excerpt":"Sitemesh permet de g\u00e9rer facilement le layout des application web JAVA. Une petite description de comment il marche.","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":92,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/rest-architecture-orientee-ressource\/","url_meta":{"origin":601,"position":2},"title":"REST &#8211; Architecture Orient\u00e9e Ressource","author":"admin","date":"mercredi 25 mars 2009","format":false,"excerpt":"Au menu aujourd'hui, un sujet tr\u00e8s tendance: REST. Abord\u00e9\u00a0 par le biais de l'Architecture Orient\u00e9 Ressource (ou ROA: Resource Oriented Architecture), autrement dit, comment cr\u00e9er une architecture de service bas\u00e9 sur REST. D\u00e9finitions Comme toujours, commen\u00e7ons par quelques d\u00e9finitions. Je vais les faire assez th\u00e9orique sinon apr\u00e8s, il ne me\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1330,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/devoxx-france-2021-ledition-9-3-4\/","url_meta":{"origin":601,"position":3},"title":"Devoxx France 2021 &#8211; l&rsquo;\u00e9dition 9 3\/4","author":"admin","date":"vendredi  1 octobre 2021","format":false,"excerpt":"Cette semaine, c'est Devoxx France. Et pour la premi\u00e8re fois depuis pas mal de temps, je sors de chez moi, et j'y vais ! Je vous \u00e9cris ces mots dans le train de retour de la deuxi\u00e8me journ\u00e9e, pas de troisi\u00e8me pour moi cette ann\u00e9e. J'ai assist\u00e9 \u00e0 quelques talks,\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":515,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/voyage\/carnet-de-voyage-jordanie-partie-4-aqaba-et-la-mer-rouge\/","url_meta":{"origin":601,"position":4},"title":"Carnet de voyage Jordanie &#8211; partie 4 &#8211; Aqaba et la mer rouge","author":"admin","date":"dimanche  6 f\u00e9vrier 2011","format":false,"excerpt":"Jour 12 \u00e0 16 Aqaba Apr\u00e8s 2H30 de voiture, nous voici arriv\u00e9 au Bedouin Village Garden \u00e0 Aqaba, un jolie h\u00f4tel en face de la mer rouge (de l'autre cot\u00e9 de la route) fait de bungalow climatis\u00e9, diss\u00e9min\u00e9 dans un jardin tropical remplit de terrasse et au milieu duquel tr\u00f4ne\u2026","rel":"","context":"Dans &quot;voyage&quot;","block_context":{"text":"voyage","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/voyage\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Jordanie-Aqaba-1-300x200.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":936,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/etre-speaker-a-devoxx-france\/","url_meta":{"origin":601,"position":5},"title":"Etre speaker \u00e0 Devoxx France","author":"admin","date":"mercredi 17 juillet 2019","format":false,"excerpt":"J'ai eu la chance de donner deux talks \u00e0 Devoxx France cette ann\u00e9e (2019). Voici un petit retour d'exp\u00e9rience sur comment j'en suis arriv\u00e9 l\u00e0, et comment s'est pass\u00e9 cette exp\u00e9rience. \u00c9tape 1 : les CFPs Lorsque la saison des CFPs arrive, comme chaque ann\u00e9e, reviens le questionnement \"Est-ce que\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=601"}],"version-history":[{"count":0,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/601\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}