{"id":229797,"date":"2022-11-04T12:22:00","date_gmt":"2022-11-04T09:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229797"},"modified":"2022-11-09T16:28:08","modified_gmt":"2022-11-09T13:28:08","slug":"prototipazione-rapida-dal-prototipo-al-codice-parte-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-dal-prototipo-al-codice-parte-2\/","title":{"rendered":"Prototipazione rapida: dal prototipo al codice, parte 2"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-da-prototipazione-a-codice-parte-1\/\" title=\"Il post precedente\" >Il post precedente<\/a> dimostra molto lavoro nel prendere qualcosa che una volta era un prototipo rapido e portare quel prototipo al codice. Se non hai seguito insieme, abbiamo fatto quanto segue:<\/p>\n<ol>\n<li>parlato e costruito un prototipo per un plugin,<\/li>\n<li>schematizzato un approccio orientato agli oggetti pu\u00f2 funzionare,<\/li>\n<li>e rifattorizzato il nostro prototipo in codice reale.<\/li>\n<\/ol>\n<p>A questo punto, ci sono alcune altre cose che possiamo fare per migliorare il nostro codice. Vale a dire, possiamo introdurre il concetto di namespace. Ci\u00f2 porta l&#8217;organizzazione a fare un ulteriore passo avanti e pu\u00f2 pagare dividendi per progetti pi\u00f9 grandi.<\/p>\n<p>Quindi, ecco uno sguardo a come questo si svolge nel nostro progetto attuale.<\/p>\n<h2>Prototipo da codificare: spazi dei nomi<\/h2>\n<p>Ho trattato in modo approfondito gli spazi dei nomi nei post precedenti. Se non l&#8217;hai letto, te <a href=\"https:\/\/wordpress.mediadoma.com\/it\/spazi-dei-nomi-e-caricamento-automatico-in-wordpress\/\" title=\"lo consiglio\" >lo consiglio<\/a>. Quindi torna indietro e controlla il resto del post.<\/p>\n<p>Se scegli di saltare l&#8217;articolo, ecco <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una breve definizione di spazio dei nomi<\/a> :<\/p>\n<blockquote>\n<p>I namespace sono progettati per risolvere due problemi che gli autori di librerie e applicazioni incontrano durante la creazione di elementi di codice riutilizzabili come classi o funzioni&#8230;<\/p>\n<\/blockquote>\n<p>E l&#8217;idea generale \u00e8 che organizziamo le nostre classi sulla base di una relazione logica che hanno tra loro.<\/p>\n<p>Inoltre, organizziamo anche i file all&#8217;interno di directory che corrispondono allo spazio dei nomi. Questo non \u00e8 qualcosa che deve essere fatto, ma trovo che aiuti avere le classi organizzate logicamente sul disco nel modo in cui sono organizzate virtualmente nello spazio dei nomi.<\/p>\n<p>Detto questo, organizziamo i file.<\/p>\n<h3>Organizzare i file<\/h3>\n<p>Invece di iniziare con il file del plugin principale, iniziamo prima con l&#8217;organizzazione dei nostri file.<\/p>\n<ul>\n<li>I file Meta Box e Meta Box Display risiederanno in una directory chiamata <strong>Display<\/strong>. Questo \u00e8 completamente arbitrario, ma poich\u00e9 \u00e8 quello che fanno quei file, sembra avere senso che sia l\u00ec che risiedono.<\/li>\n<li>Possiamo anche inserire i file <strong>message-description.php<\/strong> e <strong>no-post-list.php<\/strong> in quella directory, ma inserirli in una sottodirectory chiamata <strong>Views<\/strong>. Potresti chiamarlo <strong>Modelli<\/strong> o <strong>Parziali<\/strong> o qualcosa di simile.<\/li>\n<li>Successivamente, abbiamo le classi responsabili dell&#8217;interrogazione del database e la classe responsabile del coordinamento della messaggistica. Mettiamo ognuno di questi in <strong>Utility.<\/strong> Ci sono altri posti in cui potrebbero andare, certo, ma ricorda che lo scopo \u00e8 dimostrare come utilizzare gli spazi dei nomi. Quindi, se ti senti cos\u00ec incline, sentiti libero di adattare i tuoi file a tuo piacimento.<\/li>\n<\/ul>\n<p>Se hai seguito quello che abbiamo sopra, dovresti avere una struttura di directory simile a questa:<\/p>\n<p>Un modo per organizzare i tuoi file.<\/p>\n<p>Ora \u00e8 il momento di definire gli spazi dei nomi per ciascuna delle classi. Dal momento che li abbiamo organizzati tutti nelle loro directory, sar\u00e0 facile specificare uno spazio dei nomi; tuttavia, \u00e8 importante riconoscere che dovremo usare la\u00a0 parola chiave <strong><a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">use<\/a><\/strong> quando utilizziamo classi che si trovano in altri spazi dei nomi.<\/p>\n<p>Esaminiamo ciascuno dei nostri file iniziando con i file in <strong>Utility<\/strong>. Innanzitutto, inizieremo con <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-00-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\nnamespace McFarlinTRPUtility;\nuse McFarlinTRPUtilityPost_Query;\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  \/\/ Snip for brevity. \n}<\/code><\/pre>\n<p>Noterai che lo spazio dei nomi del file appare nell&#8217;intestazione insieme a una dichiarazione per utilizzare la\u00a0 classe <strong>Post Query<\/strong> che abbiamo creato. Ho aggiunto il nome della classe alla fine dello spazio dei nomi, quindi non devo usarlo in tutta la codebase.<\/p>\n<p>Notare che il costruttore ora appare <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-01-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cos\u00ec<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Instantiates the class by setting a reference to the query.\n *\n * @param string $plugin_dir The path to the root of the plugin directory.\n *\/\npublic function __construct( $plugin_dir) {\n\n    $this-&gt;query      = new Post_Query();\n    $this-&gt;plugin_dir = trailingslashit( $plugin_dir );\n}<\/code><\/pre>\n<p>Ho aggiunto un\u00a0 argomento <strong>$plugin_dir<\/strong> perch\u00e9 dobbiamo usarlo per visualizzare correttamente i risultati della query. E poich\u00e9 ora risiedono in un&#8217;area di differenza dell&#8217;applicazione, le funzioni sono <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-02-post-messenger-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">simili a questa<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Displays the description of the content of the meta box.\n *\n * @access private\n *\/\nprivate function get_post_message() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/post-list.php';\n}\n\n\/**\n * Displays the description of the content of the meta box.\n *\n * @access private\n *\/\nprivate function get_description() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/message-description.php';\n}\n\n\/**\n * Displays a message of there are no recent posts.\n *\n * @access private\n *\/\nprivate function get_no_posts_message() {\n    include_once $this-&gt;plugin_dir. 'Display\/Views\/no-post-list.php';\n}<\/code><\/pre>\n<p>Quindi, diamo un&#8217;occhiata alla\u00a0 classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-03-post-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Post Query<\/a>. Non \u00e8 cambiato molto in questa classe tranne che gli abbiamo assegnato uno spazio dei nomi e abbiamo anche aggiornato la query solo per recuperare tre post (come da <a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-1\/#comment-911828\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo commento<\/a> ).<\/p>\n<pre><code>&lt;?php\n\nnamespace McFarlinTRPUtility;\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  \/\/ Snip for brevity.\n\n    private function get_posts() {\n\n        $args = array(\n            'post_type'        =&gt; 'post',\n            'post_status'      =&gt; 'publish',\n            'posts_per_page' =&gt; 3,\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}<\/code><\/pre>\n<p>Nota nel codice, ho anche prefissato <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a> con una barra perch\u00e9 fa parte dello spazio dei nomi globale.<\/p>\n<p>Spostiamoci nella\u00a0 directory <strong>Display<\/strong> e diamo un&#8217;occhiata alla <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-04-meta-box-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">classe Meta Box<\/a>. A questo \u00e8 stato anche assegnato uno spazio dei nomi e utilizza anche il nome completo della\u00a0 classe <strong>Meta Box Display<\/strong> che esamineremo momentaneamente.<\/p>\n<pre><code>&lt;?php\n\n namespace McFarlinTRPDisplay;\n use McFarlinTRPDisplayMeta_Box_Display;\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     * @param string $plugin_dir A reference to the root of the plugin's directory.\n     *\/\n    public function __construct( $plugin_dir) {\n        $this-&gt;meta_box_display = new Meta_Box_Display( $plugin_dir );\n    }\n\n    \/\/ Snip for brevity.\n}<\/code><\/pre>\n<p>Notare che questo costruttore accetta anche la directory del plugin come argomento e la passa anche alla\u00a0 classe <strong>Meta Box Display<\/strong>. Questo perch\u00e9 le funzioni responsabili della visualizzazione dei messaggi possono essere trovate correttamente nella loro posizione nella\u00a0 directory <strong>Views<\/strong>.<\/p>\n<p>Infine, esaminiamo la\u00a0 classe <strong>Meta Box Display<\/strong>. Questa \u00e8 una classe semplice che include lo spazio dei nomi e fa riferimento al <strong>Post Messenger<\/strong> che abbiamo esaminato sopra.<\/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\nnamespace McFarlinTRPDisplay;\nuse McFarlinTRPUtilityPost_Messenger;\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     * @param string $plugin_dir A reference to the root of the plugin's directory.\n     *\/\n    public function __construct( $plugin_dir) {\n        $this-&gt;messenger = new Post_Messenger( $plugin_dir );\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() {\n        $this-&gt;messenger-&gt;get_message();\n    }\n}\n<\/code><\/pre>\n<p>A questo punto, abbiamo chiuso il cerchio attraverso il plugin. Con un&#8217;eccezione: il file bootstrap. Abbiamo aggiunto uno spazio dei nomi e dobbiamo aggiornare il modo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/38c72277ddbd0fa70a74c03598070703#file-06-bootstrap-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">in cui \u00e8 stato istanziato<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace McFarlinTRP;\nuse McFarlinTRPDisplayMeta_Box;\n\ninclude 'Display\/class-meta-box.php';\ninclude 'Display\/class-meta-box-display.php';\ninclude 'Utility\/class-post-messenger.php';\ninclude 'Utility\/class-post-query.php';\n\nadd_action( 'add_meta_boxes', __NAMESPACE__. 'trp_start' );\n\/**\n * Starts the plugin.\n *\/\nfunction trp_start() {\n\n    $meta_box = new Meta_Box( dirname( __FILE__) );\n    $meta_box-&gt;init();\n}<\/code><\/pre>\n<p>Vale a dire, abbiamo:<\/p>\n<ul>\n<li>definito lo spazio dei nomi,<\/li>\n<li>fare riferimento alla posizione della\u00a0 classe <strong>Meta Box<\/strong> ,<\/li>\n<li>aggiornato i percorsi per includere dove trovare i file (che alla fine pu\u00f2 essere fatto con un caricatore automatico),<\/li>\n<li>e aggiornato la\u00a0 chiamata <strong>add_action<\/strong>.<\/li>\n<\/ul>\n<p>Ecco il problema della chiamata ad azione aggiuntiva: poich\u00e9 WordPress deve individuare questa funzione e la funzione risiede in uno spazio dei nomi, il nome completo della funzione deve essere identificato in modo che WordPress possa richiamarla. Da qui la necessit\u00e0 di <strong><a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.nsconstants.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">NAMESPACE<\/a><\/strong> nel nome della funzione.<\/p>\n<h2>Ora siamo organizzati (con un&#8217;eccezione)<\/h2>\n<p>Come puoi vedere, gli spazi dei nomi e le directory che li corrispondono aggiungono molta organizzazione a un progetto. \u00c8 pi\u00f9 facile da seguire, pi\u00f9 facile capire dove vanno le cose (sia per i file esistenti che per quelli nuovi). E d\u00e0 meno sensazione di accumulare molti file in un unico posto.<\/p>\n<p>Anche se una classe \u00e8 un po&#8217; un monolito, pu\u00f2 comunque essere organizzata in modo tale da semplificare la manutenzione.<\/p>\n<p>Detto questo, c&#8217;\u00e8 ancora qualcosa che cambierei su questo plugin: passare nella directory del plugin in questo modo non \u00e8 qualcosa che aiuta con una bassa coesione e accoppia pi\u00f9 strettamente le classi perch\u00e9 il file bootstrap deve passare un valore in una classe che lo passa a un&#8217;altra classe che lo utilizza per caricare file e cos\u00ec via.<\/p>\n<p>Quindi ci sono modi per risolvere questo problema? Assolutamente. E forse daremo un&#8217;occhiata a questo nel post finale.<\/p>\n<p>Fino ad allora, ricorda che la versione pi\u00f9 recente del plugin \u00e8 disponibile <a href=\"https:\/\/github.com\/tommcfarlin\/three-recent-posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sul ramo master, etichettato come 0.3.0, su GitHub<\/a>.<\/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:\/\/wordpress.mediadoma.com\/it\/prototipazione-rapida-da-prototipazione-a-codice-parte-1\/\" title=\"Prototipazione rapida: da prototipazione a codice, parte 1\">Prototipazione rapida: da prototipazione a codice, parte 1<\/a><\/li>\n<li><a href=\"https:\/\/tommcfarlin.com\/prototype-to-code-2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">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>Nel continuo sforzo di passare dal prototipo al codice, prender\u00f2 il plug-in in corso e implementer\u00f2 le interfacce per l&#8217;organizzazione.<\/p>\n","protected":false},"author":1,"featured_media":223922,"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-229797","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\/229797","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=229797"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229797\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223922"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}