{"id":231102,"date":"2022-12-08T17:44:00","date_gmt":"2022-12-08T14:44:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231102"},"modified":"2022-12-07T11:56:32","modified_gmt":"2022-12-07T08:56:32","slug":"mira-a-suddividere-i-programmi-in-componenti-piu-piccoli","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/mira-a-suddividere-i-programmi-in-componenti-piu-piccoli\/","title":{"rendered":"Mira a suddividere i programmi in componenti pi\u00f9 piccoli"},"content":{"rendered":"\n<p>Una delle cose di cui parlano spesso i programmatori \u00e8 il desiderio di suddividere i programmi in componenti o funzioni pi\u00f9 piccoli, in modo che siano pi\u00f9 facili da tracciare, pi\u00f9 facili da leggere e pi\u00f9 facili da eseguire il debug.<\/p>\n<p>Ma non \u00e8 poi cos\u00ec raro vedere funzioni monolitiche con molti commenti al codice per aiutare a spiegare cosa sta succedendo nel programma.<\/p>\n<p>Non sto bussando, davvero, perch\u00e9 non conosco i vincoli in base ai quali stava lavorando un programmatore. Questo \u00e8:<\/p>\n<ul>\n<li>Qual era il budget che aveva durante la costruzione del programma?<\/li>\n<li>Quanto tempo \u00e8 stato concesso per completare il progetto?<\/li>\n<li>C&#8217;erano molte persone che lavoravano al progetto?<\/li>\n<li>Al programmatore \u00e8 stato concesso il tempo di scrivere il codice in modo da poterlo testare, refactoring o semplicemente semplificarne la lettura?<\/li>\n<\/ul>\n<p>In breve, ci sono molte ragioni &#8211; credo &#8211; per cui possiamo leggere &quot;codice errato&quot; e non deve essere sempre colpa del programmatore (questa \u00e8 solo la cosa pi\u00f9 naturale che dobbiamo buttare via quando leggiamo qualcosa che non ci piace).<\/p>\n<p>Questo significa, tuttavia, che non dovremmo sforzarci di refactoring o scrivere codice in modo tale da renderlo pi\u00f9 facile da capire? Ovviamente no. Supponendo che abbiamo il tempo per farlo, come potremmo farlo?<\/p>\n<h2>Suddividi i programmi in componenti pi\u00f9 piccoli<\/h2>\n<p>Quando si tratta di scrivere su un argomento come questo, specialmente in un&#8217;economia attiva come l&#8217;eCommerce in WordPress, pu\u00f2 essere una sfida.<\/p>\n<h3>&quot;Diventiamo specifici, 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>Cio\u00e8, posso scriverne a un livello molto dettagliato usando una suite di plugin, guardando i dati, analizzando le query e mostrando come farlo. Oppure posso scriverne a un livello leggermente superiore con l&#8217;obiettivo finale di mostrare come suddividere i programmi in componenti pi\u00f9 piccoli.<\/p>\n<p>Poich\u00e9 ci sono cos\u00ec tanti modi in cui il primo pu\u00f2 essere raggiunto, sto optando per il secondo. Cio\u00e8, questo non utilizzer\u00e0 necessariamente plug-in specifici sono query dirette. Tuttavia, utilizzer\u00e0 esempi di alto livello per aiutarti a esaminare quella che potrebbe essere una serie di query e cicli e suddividerli in funzioni pi\u00f9 piccole.<\/p>\n<h3>Un esempio generico<\/h3>\n<p>Ad esempio, supponiamo che sto lavorando su una funzionalit\u00e0 di un plug-in di WordPress il cui scopo finale \u00e8 recuperare tutti i vari metodi di pagamento memorizzati da un utente e relativi al proprio account.<\/p>\n<p>La sfida \u00e8 che queste informazioni sono sparse su pi\u00f9 tabelle di database (a causa dei vari plug-in utilizzati), quindi ci sono alcune query che devono essere eseguite e quindi recuperate.<\/p>\n<p>I passaggi per effettuare tali query potrebbero essere simili a questo:<\/p>\n<ol>\n<li>ottenere l&#8217;ID cliente dell&#8217;utente corrente,<\/li>\n<li>ottenere tutti i numeri ID ordine per il cliente<\/li>\n<li>determinare quali metodi di pagamento sono stati utilizzati per ciascun ordine<\/li>\n<li>recuperare le suddette modalit\u00e0 di pagamento e quindi inviare le informazioni effettuate al cliente<\/li>\n<\/ol>\n<p>A seconda di come \u00e8 impostato il database, in base al tuo livello di abilit\u00e0 SQL e in base al modo in cui i vari plug-in per la gestione di tutti i dati di cui sopra funzionano in tandem, potrebbe essere facile scrivere una query di grandi dimensioni per recuperare queste informazioni.<\/p>\n<p>Ma se hai lavorato con l&#8217;eCommerce in WordPress e vari plugin, sai che non \u00e8 sempre cos\u00ec facile.<\/p>\n<p>Invece, stai guardando qualcosa come:<\/p>\n<ol>\n<li>dobbiamo ottenere il profilo di un cliente dai metadati dell&#8217;utente,<\/li>\n<li>abbiamo bisogno di trovare tutti gli ordini che l&#8217;utente ha fatto, e questo spesso pu\u00f2 essere associato al post o alla tabella dei metadati del post,<\/li>\n<li>molto probabilmente i metodi di pagamento possono essere memorizzati nella loro tabella associata all&#8217;utente tramite qualche tipo di token,<\/li>\n<li>il token sopra si trova in una tabella ed \u00e8 correlato a una determinata informazione in un&#8217;altra tabella da cui devi quindi dedurre osservando i dati esistenti nel database.<\/li>\n<\/ol>\n<p>In definitiva, devi creare una serie di query solo comprendendo prima come eseguire query per i dati che stai cercando. \u00c8 gi\u00e0 abbastanza impegnativo cos\u00ec com&#8217;\u00e8. Ma quando riesci a farlo, diciamo che stai scrivendo le tue query in sequenza e quindi utilizzando i risultati di ciascuna per ottenere l&#8217;output desiderato.<\/p>\n<p>Ci\u00f2 pu\u00f2 comportare <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/7c0c8b50cd361f22b5f777544adc2204#file-00-monolithic-queries-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">qualcosa<\/a><\/strong> del genere :<\/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>Ma non deve essere cos\u00ec.<\/p>\n<p>In primo luogo, queste sono tutte query indipendenti con insiemi di risultati indipendenti anche se devono essere utilizzate in tandem. Ci\u00f2 significa che possiamo dividerli e valutare i risultati di ciascuno prima di procedere con il passaggio successivo.<\/p>\n<p>Inoltre, ci consente di scrivere funzioni pi\u00f9 piccole e pi\u00f9 coese. Anche se possono dipendere l&#8217;uno dall&#8217;altro, possiamo impostare ogni funzione per accettare un argomento (o un insieme di argomenti da cui possiamo recuperare tutte le informazioni.<\/p>\n<p>Forse il risultato finale potrebbe assomigliare <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\">a questo<\/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>Ovviamente, non posso mostrare alcun SQL reale &#8211; beh, almeno non ovunque &#8211; perch\u00e9 non conosco l&#8217;impostazione generale n\u00e9 so esattamente con quali plugin o schemi stai lavorando.<\/p>\n<p>Ma non \u00e8 mai stato questo il punto di questo post.<\/p>\n<p>Invece, il punto finale che sto cercando di trasmettere \u00e8 questo: anche se possiamo lavorare con vincoli molto limitati, possiamo comunque suddividere i programmi in componenti pi\u00f9 piccoli che ci aiutano a descrivere cosa sta succedendo, capire come \u00e8 fatto e quindi inviare i dati avanti e indietro tra le varie funzioni e da e verso l&#8217;utente.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una delle cose di cui parlano spesso i programmatori \u00e8 il desiderio di suddividere i programmi in componenti o funzioni pi\u00f9 piccoli, in modo che siano pi\u00f9 facili da tracciare, pi\u00f9 facili da leggere e pi\u00f9 facili da eseguire il debug.<\/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":[896,804,720],"tags":[1168],"class_list":["post-231102","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-sviluppatore","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231102","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=231102"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231102\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236233"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}