{"id":229291,"date":"2022-10-22T18:09:00","date_gmt":"2022-10-22T15:09:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229291"},"modified":"2022-11-09T06:20:01","modified_gmt":"2022-11-09T03:20:01","slug":"refactoring-dei-plugin-di-wordpress-un-piccolo-esempio","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/refactoring-dei-plugin-di-wordpress-un-piccolo-esempio\/","title":{"rendered":"Refactoring dei plugin di WordPress: un piccolo esempio"},"content":{"rendered":"\n<p>Uno dei modi in cui nascono i plugin di WordPress \u00e8 che, almeno nel mio caso, iniziano come una raccolta di funzioni utilizzate per aiutare con uno scopo particolare per un determinato progetto. Da l\u00ec, pensi &quot;Ehi, forse qualcun altro lo trover\u00e0 utile&quot;.<\/p>\n<p>Almeno questa \u00e8 stata la mia esperienza il pi\u00f9 delle volte.<\/p>\n<p>Ma il fatto \u00e8 che prima di rilasciarlo per farlo provare ad altre persone, vuoi passare attraverso il processo di pulizia del codice. Non sto nemmeno parlando di refactoring dei plugin di WordPress, almeno non ancora.<\/p>\n<p>Sto parlando di prendere il codice, portarlo a qualcosa che funzioner\u00e0 come un plugin per WordPress e quindi eventualmente refactoring del codice.<\/p>\n<h2>Refactoring dei plugin di WordPress<\/h2>\n<p>Passare attraverso l&#8217;intero processo di refactoring dei plug-in di WordPress, per non parlare di un singolo plug-in di WordPress, pu\u00f2 essere arduo, ma condividere come refactoring una parte di un plug-in \u00e8 qualcosa che \u00e8 fattibile.<\/p>\n<p>Quindi user\u00f2 un esempio di come stavo usando qualcosa di recente (con il codice un po&#8217; astratto in modo da non preoccuparmi di essere specifico su un determinato progetto).<\/p>\n<p>Tracciare l&#8217;output ideale delle opzioni.<\/p>\n<p>Prima di farlo, per\u00f2, penso che sia importante condividere il mio processo potrebbe differire \u2013 o probabilmente \u2013 differire dal tuo (dal momento che molti di noi hanno processi diversi).<\/p>\n<ol>\n<li>Progetta il componente (s\u00ec, nemmeno il plug-in completo) in un notebook,<\/li>\n<li>Crea una lista di controllo dei casi d&#8217;uso in cui dovrebbe passare e quando dovrebbe fallire,<\/li>\n<li>Scrivi quali dati sono necessari, come sono necessari e quando dovrebbero essere ignorati<\/li>\n<li>Converti tutto quanto sopra in codice.<\/li>\n<\/ol>\n<p>Ovviamente, non converto tutto letteralmente in codice, ma hai un&#8217;idea. Forse il modo pi\u00f9 conciso per dirlo \u00e8 questo:<\/p>\n<ul>\n<li>Inizia con un metodo lungo che serva al caso d&#8217;uso ideale. Quindi rifattorizzare quel codice in modo che le funzioni siano pi\u00f9 piccole e tengano conto dei casi in cui il risultato non riuscirebbe.<\/li>\n<\/ul>\n<p>Detto questo, ecco come potrebbe apparire il codice.<\/p>\n<h3>1 Scrivere per il caso d&#8217;uso ideale<\/h3>\n<p>In questo esempio, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-00-ideal-path-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il caso d&#8217;uso ideale<\/a> \u00e8 quando l&#8217;utente carica le opzioni, le opzioni sono presenti e quindi deve eseguire un&#8217;azione se le opzioni hanno determinati valori.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options        = get_option( 'acme_date_options' );\n    $event_settings = $options['event'];\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Questa parte dovrebbe essere di facile lettura, ma non tiene conto di nient&#8217;altro che del percorso ideale attraverso il codice.<\/p>\n<h3>2 Diventa un po&#8217; difensivo<\/h3>\n<p>Successivamente, mi piace assicurarmi che le opzioni siano impostate prima di provare a leggerle. In alcuni casi, potresti voler visualizzare un avviso, generare un&#8217;eccezione o registrare informazioni.<\/p>\n<p>In questo esempio, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-02-defensive-coding-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">torner\u00f2 semplicemente<\/a> perch\u00e9 \u00e8 facile da leggere e pu\u00f2 essere regolato pi\u00f9 facilmente per il tuo uso.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! isset( $options['event'])) {\n            return;\n    }\n\n    $event_settings = $options['event'];\n    if (! isset( $event_settings['import']) ||! isset( $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Quindi questo gestisce le opzioni, ma per quanto riguarda il caso in cui le opzioni sono impostate ma non hanno i valori che ci aspettiamo? Ci\u00f2 significa che dobbiamo anche verificare che lo facciano. E, in caso contrario, ignorali, restituisci, registra un errore, genera un&#8217;eccezione e cos\u00ec via.<\/p>\n<p>Sai: la stessa cosa di cui sopra. Tranne che, in questo caso, non intraprender\u00f2 alcuna azione a meno che il codice non abbia l&#8217;informazione ideale.<\/p>\n<h3>3 Diventare un po&#8217; lunghi<\/h3>\n<p>A questo punto, il metodo sta diventando un po&#8217; lungo e sta diventando pi\u00f9 difficile da leggere. Certo, se sei un programmatore esperto, puoi affermare che &quot;Questo \u00e8 codice, non \u00e8 inglese&quot;, ma perch\u00e9 non mirare a renderlo un po&#8217; pi\u00f9 facile da seguire?<\/p>\n<p>Inoltre, rende un po&#8217; pi\u00f9 facile il test. Ma questo va oltre lo scopo di questo post. Prendi la valutazione delle opzioni come primo esempio del codice.<\/p>\n<ol>\n<li>Questo \u00e8 qualcosa che pu\u00f2 essere racchiuso nella sua funzione che non solo isola questo controllo ma rende anche un po&#8217; pi\u00f9 semplice la chiamata risultante.<\/li>\n<li>Quindi, prendi il secondo blocco di codice che verifica i valori delle opzioni ideali. Questo pu\u00f2 anche essere astratto per gli stessi motivi di cui sopra.<\/li>\n<li>E infine, imposta una funzione per assicurarti che i valori previsti siano impostati per ciascuno dei <a href=\"http:\/\/03-consolidation.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">valori specificati<\/a> :<\/li>\n<\/ol>\n<pre><code>&lt;?php\n\nprivate function has_valid_option( $option) {\n  return isset( $option );\n}\n\nprivate function has_valid_values( $value1, $value2) {\n  return! (isset( $value1) &amp;&amp; isset( $value2) );\n}\n\nprivate function can_import_data( $value1, $value2) {\n\n    return (0 === strcmp( 'yes', $value1)) &amp;&amp; (0 === strcmp( 'events', $value2) );\n}<\/code><\/pre>\n<p>Quindi ora hai due metodi pi\u00f9 piccoli che incapsulano lo stesso controllo che stavi facendo.<\/p>\n<h3>4 La funzione finale<\/h3>\n<p>A questo punto, la funzione finale \u00e8 molto pi\u00f9 facile da leggere poich\u00e9 ha due funzioni di supporto che incapsulano le loro responsabilit\u00e0 mentre <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-04-final-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questa torna a valutare il percorso ideale<\/a> attraverso il codice:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! $this-&gt;has_valid_option( $options)) {\n        return;\n    }\n\n    $event_settings = $options['event'];\n    if (! $this-&gt;has_valid_values( $event_settings['import'], $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if ($this-&gt;can_import_data( $import, $post_type)) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Basti dire che quando si tratta di refactoring dei plugin di WordPress, questo \u00e8 solo un esempio di come fare solo un segmento di esso. Ma \u00e8 un inizio, vero?<\/p>\n<h2>Plugin interi?<\/h2>\n<p>Infatti, NO? Il refactoring dei plugin di WordPress non \u00e8 uno scherzo. Ma se inizi con piccole funzioni come questa e procedi gradualmente intorno alla base di codice, diventa pi\u00f9 semplice.<\/p>\n<p>E se dedichi del tempo a pianificare il progetto dall&#8217;inizio, puoi risparmiare molto tempo tornando indietro e refactoring questo genere di cose.<\/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>Il refactoring dei plugin di WordPress funziona. Ma se inizi con piccole funzioni e procedi gradualmente intorno alla base di codice, diventa pi\u00f9 semplice.<\/p>\n","protected":false},"author":1,"featured_media":220671,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,896,751,814,720,865],"tags":[1168],"class_list":["post-229291","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-open-source-projektmanagement-3","category-plugin-2","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229291","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=229291"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229291\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/220671"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}