{"id":230778,"date":"2022-12-08T17:48:00","date_gmt":"2022-12-08T14:48:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230778"},"modified":"2022-12-07T11:56:31","modified_gmt":"2022-12-07T08:56:31","slug":"viser-a-diviser-les-programmes-en-composants-plus-petits","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/viser-a-diviser-les-programmes-en-composants-plus-petits\/","title":{"rendered":"Viser \u00e0 diviser les programmes en composants plus petits"},"content":{"rendered":"\n<p>L&rsquo;une des choses dont les programmeurs parlent souvent est le d\u00e9sir de diviser les programmes en composants ou fonctions plus petits, de sorte qu&rsquo;ils soient plus faciles \u00e0 tracer, plus faciles \u00e0 lire et plus faciles \u00e0 d\u00e9boguer.<\/p>\n<p>Mais il n&rsquo;est pas si rare de voir des fonctions monolithiques avec beaucoup de commentaires de code pour aider \u00e0 expliquer ce qui se passe dans le programme.<\/p>\n<p>Je ne frappe pas l\u00e0-dessus, vraiment, parce que je ne connais pas les contraintes sous lesquelles un programmeur travaillait. C&rsquo;est-\u00e0-dire:<\/p>\n<ul>\n<li>De quel budget disposait-il lors de la cr\u00e9ation du programme\u00a0?<\/li>\n<li>Combien de temps a \u00e9t\u00e9 accord\u00e9 pour r\u00e9aliser le projet ?<\/li>\n<li>Y avait-il beaucoup de personnes travaillant sur le projet ?<\/li>\n<li>Le programmeur a-t-il eu le temps d&rsquo;\u00e9crire le code afin de pouvoir le tester unitairement, le refactoriser ou simplement le rendre plus facile \u00e0 lire\u00a0?<\/li>\n<\/ul>\n<p>En bref, il y a beaucoup de raisons &#8211; je crois &#8211; pour lesquelles nous pouvons lire du &quot;mauvais code&quot;, et cela ne doit pas toujours \u00eatre la faute du programmeur (c&rsquo;est juste la chose la plus naturelle que nous devons rejeter lorsque nous lisons quelque chose que nous n&rsquo;aimons pas).<\/p>\n<p>Cela signifie-t-il, cependant, que nous ne devrions pas nous efforcer de refactoriser ou d&rsquo;\u00e9crire du code de mani\u00e8re \u00e0 le rendre plus facile \u00e0 comprendre? Bien s\u00fbr que non. En supposant que nous ayons le temps de le faire, comment pourrions-nous le faire\u00a0?<\/p>\n<h2>Diviser les programmes en composants plus petits<\/h2>\n<p>Lorsqu&rsquo;il s&rsquo;agit d&rsquo;\u00e9crire sur un sujet comme celui-ci, en particulier dans une \u00e9conomie aussi active que le commerce \u00e9lectronique dans WordPress, cela peut \u00eatre un d\u00e9fi.<\/p>\n<h3>&quot;Soyons pr\u00e9cis, Bob.&quot;<\/h3>\n<div class=\"sds-iframe-wrapper fitvidsignore\" style=\"position:relative;padding-top:56.25%;max-width:100%;\"><iframe allowfullscreen style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" src=\"\/\/www.youtube.com\/embed\/4M2kEiLHKhs\" frameborder=\"0\"><\/iframe><\/div>\n<p>Autrement dit, je peux \u00e9crire \u00e0 ce sujet \u00e0 un niveau tr\u00e8s d\u00e9taill\u00e9 en utilisant une suite de plugins, en regardant les donn\u00e9es, en diss\u00e9quant les requ\u00eates et en montrant comment le faire. Ou je peux l&rsquo;\u00e9crire \u00e0 un niveau l\u00e9g\u00e8rement sup\u00e9rieur avec le but ultime \u00e9tant de montrer comment diviser les programmes en composants plus petits.<\/p>\n<p>Parce qu&rsquo;il y a tellement de fa\u00e7ons de r\u00e9aliser le premier, j&rsquo;opte pour le second. Autrement dit, cela n&rsquo;utilisera pas n\u00e9cessairement des plugins sp\u00e9cifiques sont des requ\u00eates directes. Cependant, il utilisera des exemples de haut niveau pour vous aider \u00e0 parcourir ce qui pourrait \u00eatre une s\u00e9rie de requ\u00eates et de boucles et \u00e0 les diviser en fonctions plus petites.<\/p>\n<h3>Un exemple g\u00e9n\u00e9rique<\/h3>\n<p>Par exemple, disons que je travaille sur une fonctionnalit\u00e9 d&rsquo;un plugin WordPress dont le but ultime est de r\u00e9cup\u00e9rer toutes les diff\u00e9rentes m\u00e9thodes de paiement qu&rsquo;un utilisateur a stock\u00e9es et qui sont li\u00e9es \u00e0 son compte.<\/p>\n<p>Le d\u00e9fi est que ces informations sont dispers\u00e9es sur plusieurs tables de base de donn\u00e9es (en raison des diff\u00e9rents plugins utilis\u00e9s), il y a donc des requ\u00eates qui doivent \u00eatre ex\u00e9cut\u00e9es puis r\u00e9cup\u00e9r\u00e9es.<\/p>\n<p>Les \u00e9tapes pour faire de telles requ\u00eates pourraient ressembler \u00e0 ceci\u00a0:<\/p>\n<ol>\n<li>obtenir l&rsquo;identifiant client de l&rsquo;utilisateur actuel,<\/li>\n<li>obtenir tous les num\u00e9ros d&rsquo;identification de commande pour le client<\/li>\n<li>d\u00e9terminer quels modes de paiement ont \u00e9t\u00e9 utilis\u00e9s pour chaque commande<\/li>\n<li>r\u00e9cup\u00e9rer lesdits moyens de paiement puis transmettre les informations faites au client<\/li>\n<\/ol>\n<p>Selon la fa\u00e7on dont la base de donn\u00e9es est configur\u00e9e, selon votre niveau de prouesses SQL et selon la fa\u00e7on dont les diff\u00e9rents plugins pour g\u00e9rer toutes les donn\u00e9es ci-dessus fonctionnent en tandem, il peut \u00eatre facile d&rsquo;\u00e9crire une grande requ\u00eate pour r\u00e9cup\u00e9rer ces informations.<\/p>\n<p>Mais si vous avez travaill\u00e9 avec le commerce \u00e9lectronique dans WordPress et divers plugins, vous savez que ce n&rsquo;est pas toujours aussi simple.<\/p>\n<p>Au lieu de cela, vous regardez quelque chose comme :<\/p>\n<ol>\n<li>nous devons obtenir le profil d&rsquo;un client \u00e0 partir des m\u00e9tadonn\u00e9es de l&rsquo;utilisateur,<\/li>\n<li>nous devons trouver toutes les commandes que l&rsquo;utilisateur a pass\u00e9es, et cela peut souvent \u00eatre associ\u00e9 \u00e0 la publication ou \u00e0 la table de m\u00e9tadonn\u00e9es de la publication,<\/li>\n<li>les m\u00e9thodes de paiement peuvent tr\u00e8s probablement \u00eatre stock\u00e9es dans leur table associ\u00e9e \u00e0 l&rsquo;utilisateur via un type de jeton,<\/li>\n<li>le jeton ci-dessus se trouve dans une table et est li\u00e9 \u00e0 une information donn\u00e9e dans une autre table \u00e0 partir de laquelle vous devez ensuite d\u00e9duire en regardant les donn\u00e9es qui existent dans la base de donn\u00e9es.<\/li>\n<\/ol>\n<p>En fin de compte, vous devez cr\u00e9er un ensemble de requ\u00eates uniquement en comprenant d&rsquo;abord comment interroger les donn\u00e9es que vous recherchez. C&rsquo;est assez difficile comme \u00e7a. Mais lorsque vous arrivez \u00e0 faire cela, disons que vous \u00e9crivez vos requ\u00eates de mani\u00e8re s\u00e9quentielle, puis que vous utilisez les r\u00e9sultats de chacune pour obtenir le r\u00e9sultat souhait\u00e9.<\/p>\n<p>Cela peut donner <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/7c0c8b50cd361f22b5f777544adc2204#file-00-monolithic-queries-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">quelque chose comme \u00e7a<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ First, read the user ID and meta value to get authorization information\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT\n            user_id, meta_value\n        FROM $wpdb-&gt;usermeta\n        WHERE meta_key LIKE %s\n        AND user_id = %d\n        \",\n        '%customer_profile_id%',\n        filter_input(INPUT_GET, 'customer_id')\n    ),\n    ARRAY_A\n);\n\n$result = isset($results[0])? array_column($results[0], 'meta_value'): [];\nif (empty($result)) {\n    return $result;\n}\n\n\/\/ Get the ID of the current customer.\n$customers = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\", \/\/ Your custom query goes here.\n        filter_input(INPUT_GET, 'customer_id')\n    ),\n    ARRAY_A\n);\n\n$customer = isset($customers[0])? array_column($customers[0], 'customer_id'): [];\nif (empty($customer)) {\n    return $customer;\n}\n\n\/\/ Get all of the order IDs from the set of orders returned from the previous query.\n$orderIds = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\", \/\/ Your custom query goes here.\n        $customer\n    ),\n    ARRAY_A\n);\n\nreturn $orderIds;\n\n\/\/ Finally, get all of the payment methods for the orders based on their Ids.\n$orders = [];\nforeach ($orderIds as $orderId) {\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\" \/\/ The query for retrieving various payment method information based on the $orderId\n        ),\n        ARRAY_A\n    );\n\n    if (empty($results)) {\n        continue;\n    }\n\n    $orders[$orderId] = $results;\n}\n\n\/\/ Now send the information back to the user.\nwp_send_json_success($orders);\n<\/code><\/pre>\n<p>Mais il n&rsquo;a pas \u00e0 \u00eatre de cette fa\u00e7on.<\/p>\n<p>Premi\u00e8rement, ce sont toutes des requ\u00eates ind\u00e9pendantes avec des ensembles de r\u00e9sultats ind\u00e9pendants, m\u00eame si elles doivent \u00eatre utilis\u00e9es en tandem. Cela signifie que nous pouvons les s\u00e9parer et \u00e9valuer les r\u00e9sultats de chacun avant de passer \u00e0 l&rsquo;\u00e9tape suivante.<\/p>\n<p>De plus, cela nous permet d&rsquo;\u00e9crire des fonctions plus petites et plus coh\u00e9rentes. M\u00eame s&rsquo;ils peuvent d\u00e9pendre les uns des autres, nous pouvons configurer chaque fonction pour qu&rsquo;elle accepte un argument (ou un ensemble d&rsquo;arguments \u00e0 partir duquel nous pouvons r\u00e9cup\u00e9rer toutes les informations.<\/p>\n<p>Peut-\u00eatre que le r\u00e9sultat final ressemblera <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/7c0c8b50cd361f22b5f777544adc2204#file-01-breaking-apart-the-queries-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\npublic function getPaymentMethods()\n{\n  $authInfo = $this-&gt;getAuthorizationInformation();\n  $currentCustomerId = $this-&gt;getCurrentCustomerId($authInfo);\n  $orders = $this-&gt;getCustomerOrders($currentCustomerId);\n  $paymentMethods = $this-&gt;getPaymentMethodsFromOrders($orders);\n  wp_send_json_success($orders);\n}\n\nprivate function getAuthorizationInformation()\n{\n  global $wpdb;\n  $authInfo = $wpdb-&gt;get_results(\n      $wpdb-&gt;prepare(\n          \"\n          SELECT\n              user_id, meta_value\n          FROM $wpdb-&gt;usermeta\n          WHERE meta_key LIKE %s\n          AND user_id = %d\n          \",\n          '%customer_profile_id%',\n          filter_input(INPUT_GET, 'customer_id')\n      ),\n      ARRAY_A\n  );\n\n  return isset($authInfo[0])? array_column($authInfo[0], 'meta_value'): [];\n}\n\nprivate function getCurrentCustomerIdFromAuthInfo($authInfo)\n{\n  global $wpdb;\n  $customers = $wpdb-&gt;get_results(\n      $wpdb-&gt;prepare(\n          \"\", \/\/ Your custom query goes here.\n          $authInfo;\n      ),\n      ARRAY_A\n  );\n\n  return isset($customerId[0])? array_column($customerId[0], 'meta_value'): [];\n}\n\nprivate function getCustomerOrders($customerId)\n{\n  global $wpdb;\n  $orderIds = $wpdb-&gt;get_results(\n      $wpdb-&gt;prepare(\n          \"\", \/\/ Your custom query goes here.\n          $customerId\n      ),\n      ARRAY_A\n  );\n\n  return empty($orderIds)? []: $orderIds;\n}\n\nprivate function getPaymentMethodsFromOrders($orderIds)\n{\n  $paymentMethods = [];\n  foreach ($orderIds as $orderId) {\n      $results = $wpdb-&gt;get_results(\n          $wpdb-&gt;prepare(\n              \"\" \/\/ The query for retrieving various payment method information based on the $orderId\n          ),\n          ARRAY_A\n      );\n\n      if (empty($results)) {\n          continue;\n      }\n\n      $paymentMethods[$orderId] = $results;\n  }\n\n  return $paymentMethods;\n}\n<\/code><\/pre>\n<p>Bien s\u00fbr, je ne peux pas montrer de SQL r\u00e9el &#8211; enfin, du moins pas partout &#8211; parce que je ne connais pas la configuration g\u00e9n\u00e9rale et je ne sais pas exactement avec quels plugins ou sch\u00e9mas vous travaillez.<\/p>\n<p>Mais cela n&rsquo;a jamais \u00e9t\u00e9 le but de ce post.<\/p>\n<p>Au lieu de cela, le point ultime que j&rsquo;essaie de transmettre est le suivant\u00a0: m\u00eame si nous travaillons sous des contraintes tr\u00e8s limit\u00e9es, nous pouvons toujours diviser les programmes en composants plus petits qui nous aident \u00e0 d\u00e9crire ce qui se passe, \u00e0 comprendre comment cela se passe, puis \u00e0 envoyer des donn\u00e9es va-et-vient entre diverses fonctions et vers et depuis l&rsquo;utilisateur.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;une des choses dont les programmeurs parlent souvent est le d\u00e9sir de diviser les programmes en composants ou fonctions plus petits, de sorte qu&rsquo;ils soient plus faciles \u00e0 tracer, plus faciles \u00e0 lire et plus faciles \u00e0 d\u00e9boguer.<\/p>\n","protected":false},"author":1,"featured_media":236233,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,801],"tags":[1167],"class_list":["post-230778","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-php-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230778","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=230778"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230778\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236233"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}