{"id":229786,"date":"2022-11-03T12:23:00","date_gmt":"2022-11-03T09:23:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229786"},"modified":"2022-11-09T16:28:03","modified_gmt":"2022-11-09T13:28:03","slug":"prototipazione-rapida-da-prototipazione-a-codice-parte-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-da-prototipazione-a-codice-parte-1\/","title":{"rendered":"Prototipazione rapida: da prototipazione a codice, parte 1"},"content":{"rendered":"\n<p>Per quanto riguarda i prototipi rapidi e WordPress, finora abbiamo fatto due cose:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-con-wordpress-dal-concetto-al-plug-in\/\" title=\"pianificato il plugin\" >pianificato il plugin<\/a> ,<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-con-wordpress-analisi-concettuale\/\" title=\"ha abbozzato un diagramma per come organizzare il codice\" >ha abbozzato un diagramma per come organizzare il codice<\/a><\/li>\n<\/ol>\n<p>A questo punto, abbiamo fatto abbastanza lavoro per giustificare l&#8217;inizio del refactoring del nostro codice. Cio\u00e8, inizieremo a convertire il prototipo in codice. Ma questo \u00e8 qualcosa che dovr\u00e0 essere fatto in due fasi.<\/p>\n<p>Innanzitutto, introdurremo semplicemente classi che rappresentano i diagrammi del post precedente e che incapsulano la responsabilit\u00e0 di ogni progetto.<\/p>\n<p>Successivamente, esamineremo l&#8217;organizzazione del codice in spazi dei nomi e pacchetti. Prima di poterlo fare, per\u00f2, dobbiamo assicurarci che il codice sia orientato agli oggetti e rimanga funzionale. Ecco cosa accadr\u00e0 in questo post.<\/p>\n<h2>Prototipo da codificare<\/h2>\n<p>Se hai letto i post precedenti, nota che ho intenzione di seguire l&#8217;organizzazione che ho delineato nell&#8217;ultimo post. Non devi seguire questo particolare design, ovviamente.<\/p>\n<h3>Una parola sul controllo del codice sorgente<\/h3>\n<p>Se stai usando il controllo del codice sorgente, \u00e8 qui che ti consiglio di creare un <a href=\"https:\/\/git-scm.com\/book\/en\/v1\/Git-Branching\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ramo<\/a> del ramo principale (se stai usando Git) in modo da poter svolgere il tuo lavoro senza gravare sulla versione stabile del codice.<\/p>\n<p>Questo \u00e8 un po&#8217; oltre lo scopo della serie, quindi se non stai usando il controllo del codice sorgente, non preoccuparti. Se lo sei, sto optando per <strong>sviluppare<\/strong> come nome di questo ramo. Lo unir\u00f2 di nuovo al <strong>master\u00a0<\/strong> una volta che sar\u00f2 sicuro che sia funzionante.<\/p>\n<h3>Scrivere codice<\/h3>\n<p>Come per il lavoro abbozzato ieri, creer\u00f2 due classi:<\/p>\n<ol>\n<li>la classe meta box,<\/li>\n<li>la classe di visualizzazione meta box.<\/li>\n<\/ol>\n<p>Ci sar\u00e0 del riutilizzo del codice da ci\u00f2 che abbiamo gi\u00e0 visto, come vedrai nel codice seguente.<\/p>\n<h4>Il codice<\/h4>\n<p>Innanzitutto, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-00-class-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la nostra meta box<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Registers the Meta Box with WordPress.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Registers the Meta Box with WordPress. Defines the ID, title, display function,\n * and the post type on which it will live.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Meta_Box_Display\n     *\/\n    private $meta_box_display;\n\n    \/**\n     * Instantiates the class by setting its property equal to a reference to its display.\n     *\/\n    public function __construct() {\n        $this-&gt;meta_box_display = new Meta_Box_Display();\n    }\n\n    \/**\n     * The function responsible for hooking into the WordPress API.\n     *\/\n    public function init() {\n\n        add_meta_box(\n            'three-recent-posts',\n            'Three Recent Posts',\n            array( $this-&gt;meta_box_display, 'display' ),\n            'post',\n            'side'\n        );\n    }\n}\n<\/code><\/pre>\n<p>E poi, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-01-class-meta-box-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">il nostro display<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Defines the display for the meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Defines the display for the meta box that will render the content in the\n * context of its meta box.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Meta_Box_Display {\n\n    \/**\n     * A reference to the class that will display the contents in the meta box.\n     *\n     * @access private\n     * @var    Post_Messenger\n     *\/\n    private $messenger;\n\n    \/**\n     * Instantiates the object by setting a property equal to that of the class\n     * responsible for rendering the messages from the post query.\n     *\/\n    public function __construct() {\n        $this-&gt;messenger = new Post_Messenger( $this );\n    }\n\n    \/**\n     * If there are posts to display, renders them in the metabox. Otherwise, displays\n     * a note that there are no posts to display.\n     *\/\n    public function display( $message) {\n        $this-&gt;messenger-&gt;get_message();\n    }\n}\n<\/code><\/pre>\n<p>Quello che nel codice della meta box, nel codice della meta box, stiamo creando un&#8217;istanza esplicita del display in modo che possiamo chiamarlo come metodo di visualizzazione quando necessario.<\/p>\n<p>Un&#8217;altra alternativa sarebbe quella di istanziare i due oggetti separatamente e quindi iniettare il display nella meta box tramite l&#8217;iniezione del costruttore o qualcosa di simile. Questo dovrebbe essere fatto in una classe di terze parti.<\/p>\n<p>I vantaggi di questo derivano dal disaccoppiare un po&#8217; di pi\u00f9 le due classi. Forse esamineremo come farlo nel prossimo post.<\/p>\n<p>Dopodich\u00e9, dobbiamo andare avanti e definire la classe responsabile della visualizzazione dei messaggi nel contesto del Meta Box Display. Questo \u00e8 ci\u00f2 che chiameremo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-02-class-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Messenger<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Display content for the meta box when requested.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Retrieves information from the class responsible for querying the database and\n * renders it in the context of our meta box when called via the Meta Box Display.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Messenger {\n\n    \/**\n     * A reference to the query resonsible for retrieving post information from\n     * the database.\n     *\n     * @access private\n     * @var    WP_Query\n     *\/\n    private $query;\n\n    \/**\n     * A reference to the message that's displayed in the view of the\n     * meta box.\n     *\n     * @access private\n     *\/\n    private $message;\n\n    \/**\n     * Instantiates the class by setting a reference to the query.\n     *\/\n    public function __construct() {\n        $this-&gt;query = new Post_Query();\n    }\n\n    \/**\n     * Retrieves the content to be displayed in the meta box.\n     *\/\n    public function get_message() {\n\n        $this-&gt;get_description();\n\n        if ($this-&gt;query-&gt;has_posts()) {\n            $this-&gt;get_post_message();\n        } else {\n            $this-&gt;get_no_posts_message();\n        }\n    }\n\n    \/**\n     * Displays the description of the content of the meta box.\n     *\n     * @access private\n     *\/\n    private function get_post_message() {\n        include_once 'post-list.php';\n    }\n\n    \/**\n     * Displays the description of the content of the meta box.\n     *\n     * @access private\n     *\/\n    private function get_description() {\n        include_once 'message-description.php';\n    }\n\n    \/**\n     * Displays a message of there are no recent posts.\n     *\n     * @access private\n     *\/\n    private function get_no_posts_message() {\n        include_once 'no-post-list.php';\n    }\n}\n<\/code><\/pre>\n<p>Si noti qui che Post Messenger fa riferimento anche a <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-03-post-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Query<\/a>. Questa \u00e8 la classe in cui avviene la comunicazione al database. Ho anche incluso alcune funzioni di supporto per rendere il codice di visualizzazione un po&#8217; pi\u00f9 semplice, come vedremo tra poco.<\/p>\n<pre><code>&lt;?php\n\/**\n * Queries the database for three most recent posts.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\n\n\/**\n * Queries the database for three most recent posts. Returns the query to the\n * caller so that it can be interrogates for posts or not.\n *\n * @author Tom McFarlin\n * @since  0.2.0\n *\/\nclass Post_Query {\n\n    \/**\n     * A reference to the WP_Query this class wraps.\n     *\n     * @access private\n     * @var    WP_Query\n     *\/\n    private $query;\n\n    \/**\n     * Instantiates the class by preparing instance data and executing the\n     * query so the display can render the contents.\n     *\/\n    public function __construct() {\n\n        $this-&gt;query = null;\n        $this-&gt;get_posts();\n    }\n\n    \/**\n     * Executes the query for returning the post recent posts ordered by date.\n     *\n     * @access private\n     *\/\n    private function get_posts() {\n\n        $args = array(\n            'post_type'   =&gt; 'post',\n            'post_status' =&gt; 'publish',\n            'orderby'     =&gt; 'date',\n            'order'       =&gt; 'desc',\n        );\n        $this-&gt;query = new WP_Query( $args );\n\n        return $this-&gt;query;\n    }\n\n    \/**\n     * A helper function to determine if the query has any posts.\n     *\/\n    public function has_posts() {\n        return! $this-&gt;query-&gt;have_posts();\n    }\n\n    \/**\n     * A helper function for retrieving the next post in the list of\n     * posts\n     *\/\n    public function the_post() {\n        return $this-&gt;query-&gt;the_post();\n    }\n}\n<\/code><\/pre>\n<p>E questo \u00e8 tutto per le classi principali. Naturalmente, dobbiamo ancora parlare delle opinioni.<\/p>\n<h4>Le visualizzazioni<\/h4>\n<p>Le viste sono responsabili del rendering dell&#8217;HTML nel contesto della meta box. Non mi piace scrivere HTML nel contesto di PHP (n\u00e9 mi piace mischiare PHP nel contesto di HTML, ma questo \u00e8 inevitabile in questo progetto).<\/p>\n<p>Ci sono alcuni grandi progetti di modelli per renderlo pi\u00f9 facile, ma sto divagando. Ad ogni modo, noterai che nel\u00a0 file <strong>post-list.php<\/strong> ci sono riferimenti a funzioni di supporto nella classe Post Query. Questo per assicurarmi di non esporre troppe propriet\u00e0 e di violare la legge di Demetra.<\/p>\n<p>Diamo prima un&#8217;occhiata a quel file poich\u00e9 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-04-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e8 il pi\u00f9 complicato<\/a> :<\/p>\n<pre><code>&lt;ol&gt;\n    &lt;?php while ($this-&gt;query-&gt;has_posts()) {  ?&gt;\n        &lt;?php $this-&gt;query-&gt;the_post(); ?&gt;\n        &lt;li&gt;\n            &lt;a href=\"&lt;?php get_the_permalink(); ?&gt;\" target=\"_blank\"&gt;\n                &lt;?php echo get_the_title(); ?&gt;\n            &lt;\/a&gt;\n        &lt;\/li&gt;\n    &lt;?php } ?&gt;\n&lt;\/ol&gt;<\/code><\/pre>\n<p>Assomiglia al codice standard di WordPress, ma ricorda che poich\u00e9 questo file \u00e8 chiamato all&#8217;interno di <strong>Post Messenger<\/strong>, si riferir\u00e0 alla query come alla query che \u00e8 racchiusa da quella classe.<\/p>\n<p>Gli ultimi due file sono abbastanza semplici. Uno di questi fornisce <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-06-message-description-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una descrizione<\/a> :<\/p>\n<pre><code>&lt;p&gt;\n    &lt;span class=\"description\"&gt;\n        Displays up to the three most recent posts.\n    &lt;\/span&gt;&lt;!-- .description --&gt;\n&lt;\/p&gt;<\/code><\/pre>\n<p>L&#8217;altro fornisce un messaggio quando non ci sono <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-07-no-post-list-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">post<\/a> :<\/p>\n<pre><code>&lt;p&gt;There are no recent posts.&lt;\/p&gt;<\/code><\/pre>\n<p>A parte questo, la funzionalit\u00e0 di base \u00e8 stata eseguita.<\/p>\n<h3>Avvio del plug-in<\/h3>\n<p>L&#8217;ultima cosa che dobbiamo fare \u00e8 avviare il plugin. Per fare ci\u00f2, modifichiamo il codice nel file del plugin principale in modo che appaia <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1876be773467946ec2972ae32e0c97a3#file-08-three-recent-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cos\u00ec<\/a> :<\/p>\n<pre><code>&lt;?php\n\/**\n * Three Recent Posts\n *\n * @package     TRP\n * @author      Tom McFarlin\n * @copyright   2017 Tom McFarlin\n * @license     MIT\n *\n * @wordpress-plugin\n * Plugin Name: Three Recent Posts\n * Plugin URI:  https:\/\/tommcfarlin.com\/three-recent-posts\/\n * Description: Displays the three mot recent posts in your post editor screen.\n * Version:     0.2.0\n * Author:      Tom McFarlin\n * Author URI:  https:\/\/tommcfarlin.com\n * Text Domain: three-recent-posts\n * License:     GPL\n * License URI: http:\/\/www.gnu.org\/licenses\/gpl-3.0.txt\n *\/\n\ninclude 'class-meta-box.php';\ninclude 'class-meta-box-display.php';\ninclude 'class-post-messenger.php';\ninclude 'class-post-query.php';\n\nadd_action( 'add_meta_boxes', 'trp_start' );\n\/**\n * Starts the plugin.\n *\/\nfunction trp_start() {\n\n    $meta_box = new Meta_Box();\n    $meta_box-&gt;init();\n}\n<\/code><\/pre>\n<p>Ci\u00f2 si collegher\u00e0 a WordPress, istanzia il nostro plug-in e quindi lo metter\u00e0 in moto. Quando lo esegui all&#8217;interno della tua installazione di WordPress, dovrebbe apparire esattamente come nella prima versione.<\/p>\n<p>L&#8217;unica differenza \u00e8 che ora abbiamo le cose organizzate in classi piuttosto che in singole funzioni.<\/p>\n<h2>Appunti<\/h2>\n<p>In primo luogo, ci sono opportunit\u00e0 per il refactoring qui che ridurrebbe ulteriormente il disaccoppiamento (come diversi tipi di <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">iniezione di dipendenza<\/a>, ecc.), Ma lo scopo di questa serie non \u00e8 quello di coprirlo.<\/p>\n<p>Invece, \u00e8 prendere l&#8217;idea di vedere plugin scritti da molte funzioni procedurali e poi suddividerli in classi pi\u00f9 concettuali che incapsulano le loro responsabilit\u00e0.<\/p>\n<p>In secondo luogo, se rivedi il codice sorgente nel repository per questa versione del progetto, vedrai che ho introdotto anche composer.json. Questo \u00e8 cos\u00ec che posso sfruttare <a href=\"https:\/\/tommcfarlin.com\/php-codesniffer-with-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP CodeSniffer<\/a> e gli <a href=\"https:\/\/tommcfarlin.com\/following-the-wordpress-coding-standards\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">standard di codifica di WordPress<\/a> durante la scrittura del codice.<\/p>\n<p>Nell&#8217;ultima parte della serie, analizzeremo lo <a href=\"https:\/\/wordpress.mediadoma.com\/it\/spazi-dei-nomi-e-caricamento-automatico-in-wordpress\/\" title=\"spazio dei nomi\">spazio dei nomi<\/a> e riorganizzeremo i file. Se il tempo lo consente, includeremo un caricatore automatico in modo da non dover includere manualmente i file nella parte superiore del nostro file di plug-in.<\/p>\n<p>Infine, ho unito questo codice <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\/tree\/0.2.1\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">in master e l&#8217;ho etichettato come 0.2.1<\/a> (poich\u00e9 ho dovuto fare un piccolo aggiornamento rapido) poich\u00e9 \u00e8 ancora un lavoro in corso.<\/p>\n<h2>Messaggi di serie<\/h2>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-con-wordpress-dal-concetto-al-plug-in\/\" title=\"Prototipazione rapida con WordPress: dal concetto al plug-in\">Prototipazione rapida con WordPress: dal concetto al plug-in<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-con-wordpress-analisi-concettuale\/\" title=\"Prototipazione rapida con WordPress: analisi concettuale\">Prototipazione rapida con WordPress: analisi concettuale<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Prototipazione rapida: da prototipazione a codice, parte 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-dal-prototipo-al-codice-parte-2\/\" title=\"Prototipazione rapida: dal prototipo al codice, parte 2\">Prototipazione rapida: dal prototipo al codice, parte 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-introduzione-del-caricamento-automatico\/\" title=\"Prototipazione rapida: introduzione del caricamento automatico\">Prototipazione rapida: introduzione del caricamento automatico<\/a><\/li>\n<\/ol>\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>\u00c8 qui che iniziamo a convertire il nostro prototipo in codice. Dovrebbe mostrare perch\u00e9 \u00e8 utile mettere la previdenza in un progetto.<\/p>\n","protected":false},"author":1,"featured_media":223902,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,720,844],"tags":[1168],"class_list":["post-229786","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229786","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=229786"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229786\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223902"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}