{"id":229739,"date":"2022-11-02T18:46:00","date_gmt":"2022-11-02T15:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229739"},"modified":"2022-11-09T16:10:32","modified_gmt":"2022-11-09T13:10:32","slug":"il-primer-del-modello-di-repository","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/il-primer-del-modello-di-repository\/","title":{"rendered":"Il primer del modello di repository"},"content":{"rendered":"\n<p>Ogni volta che stai lavorando a un progetto pi\u00f9 ampio basato su WordPress, le probabilit\u00e0 che lavorerai con pi\u00f9 di una singola fonte di dati, ovvero il database di WordPress, sono pi\u00f9 alte del normale. Ad esempio, potresti lavorare su un progetto che deve coordinare le informazioni da:<\/p>\n<ul>\n<li>il database di WordPress,<\/li>\n<li>un sistema di biglietteria di help desk,<\/li>\n<li>un sistema di importazione dei contenuti,<\/li>\n<li>un&#8217;altra API di terze parti,<\/li>\n<li>e possibile di pi\u00f9.<\/li>\n<\/ul>\n<p>E quando ci\u00f2 accade, pu\u00f2 diventare un po&#8217; complicato scrivere codice che renda facile recuperare le informazioni da quei luoghi diversi. Questo \u00e8 ci\u00f2 di cui gli sviluppatori di solito parlano quando si riferiscono alla gestione dei &quot;livelli&quot; nella loro applicazione. Cio\u00e8,<\/p>\n<ul>\n<li>ci sono livelli per la presentazione delle informazioni all&#8217;utente,<br \/>\nlivelli per la gestione della logica aziendale (o logica di dominio),<\/li>\n<li>livelli per la comunicazione con le API,<\/li>\n<li>e livelli per la memorizzazione dei dati.<\/li>\n<\/ul>\n<p>Onestamente, non \u00e8 necessario disporre di una variet\u00e0 di archivi di dati da guardare per creare un livello che semplifichi l&#8217;invio e il recupero dei dati dal database, proprio quando \u00e8 pi\u00f9 comune. Puoi lavorare altrettanto efficacemente con un singolo archivio dati, come il database di WordPress, quando implementi il \u200b\u200bmodello di repository.<\/p>\n<p>Indipendentemente da ci\u00f2, se stai creando un sito Web, un&#8217;applicazione Web o un plug-in pi\u00f9 grandi, l&#8217;implementazione del modello di repository \u00e8 qualcosa che pu\u00f2 pagare dividendi in termini di manutenzione, chiarezza del codice e separazione delle preoccupazioni.<\/p>\n<p>Ma come potrebbe essere implementato all&#8217;interno di WordPress? Non \u00e8 terribilmente impegnativo, ma prima di tutto vale la pena rivedere un primer del repository prima di passare a qualsiasi codice.<\/p>\n<h2>Un primer per pattern di repository<\/h2>\n<p>Prima di esaminare un&#8217;effettiva implementazione in WordPress, \u00e8 importante capire cos&#8217;\u00e8 il repository, come \u00e8 definito, cosa offre e una sua implementazione generica. Condivider\u00f2 alcune ulteriori letture alla fine dell&#8217;articolo, ma fino ad allora tratter\u00f2 la mia opinione generale sullo schema qui.<\/p>\n<p>Innanzitutto, un&#8217;implementazione di questo modello pu\u00f2 diventare pi\u00f9 complicata del necessario per i principianti. Questo non vuol dire che lo schema reale non valga la pena di essere compreso, ma se stai solo cercando di bagnarti con questo, non sono un fan di gettare i lettori nel profondo. Non credo sia il modo migliore per imparare.<\/p>\n<p>Invece, vale la pena scomporre il problema e ricostruirlo in qualcosa di un po&#8217; pi\u00f9 elegante. Quindi \u00e8 quello che ho intenzione di fare.<\/p>\n<h3>Una parola sul disaccoppiamento<\/h3>\n<p>Quando si parla di programmazione orientata agli oggetti, si parla spesso dell&#8217;idea di &quot;disaccoppiare&quot; parti del sistema. Se hai familiarit\u00e0 con l&#8217; <a href=\"https:\/\/8thlight.com\/blog\/uncle-bob\/2014\/05\/08\/SingleReponsibilityPrinciple.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">accoppiamento e la coesione<\/a>, allora sai perch\u00e9.<\/p>\n<p>In caso contrario, basti sapere che pi\u00f9 accoppiati sono i componenti del tuo sistema, pi\u00f9 difficile sar\u00e0 cambiarli. Sanno troppo l&#8217;uno dell&#8217;altro. Cio\u00e8, se si modifica uno degli aspetti del sistema, \u00e8 probabile che si verifichi una cascata o un impatto su un&#8217;altra parte del sistema che non avresti mai voluto che accadesse. Quindi ti rimane quando devi dedicare molto pi\u00f9 tempo a riparare tutti questi altri &quot;punti di contatto&quot; nel sistema che non dovrebbero essere necessari.<\/p>\n<p>L&#8217;implementazione di varie strategie, come il modello di repository, pu\u00f2 aiutare a disaccoppiare parti del sistema. Caso in questione: il livello di presentazione non sa come sia l&#8217;organizzazione del datastore sottostante. Non ha bisogno di conoscere SQL. Non ha bisogno di sapere che \u00e8 un database. Invece, ha solo bisogno di sapere come parlare con il repository.<\/p>\n<p>Bello, vero?<\/p>\n<p>Ci\u00f2 significa che puoi sostituire l&#8217;archivio dati di back-end e, supponendo che la tua API sia solida; la tua applicazione continuer\u00e0 a funzionare senza modifiche minime. Ed \u00e8 questo che significa essere veramente disaccoppiati.<\/p>\n<h3>Un&#8217;implementazione del modello di repository<\/h3>\n<p>Quindi, che aspetto ha il modello del repository? Come con la maggior parte dei modelli di progettazione, esiste una forma generica del modello, e questo \u00e8 sempre utile, ma penso che aiuti anche quelli di noi che lavorano in WordPress a vedere come potrebbe funzionare nel contesto, sai, di WordPress.\u00a0<\/p>\n<p>Quindi, prima, voglio scomporre il modello stesso e poi fornire un esempio di come potrebbe apparire quando si lavora con WordPress.<\/p>\n<h3>Un implementazione generico del modello di repository<\/h3>\n<p>L&#8217;effettiva implementazione del pattern del repository \u00e8 piuttosto semplice. In effetti, non sono mai sicuro che sia cos\u00ec utile perch\u00e9 mostra solo come interagiscono tra loro gli archivi dati, il repository e il resto dell&#8217;applicazione.<\/p>\n<p>Non fraintendetemi: sono tutto per i modelli concettuali di come sono organizzate le cose. Personalmente, mi aiuta a pensare alla struttura di un&#8217;applicazione quando la costruisco, ma se \u00e8 troppo generica, non \u00e8 di grande aiuto.<\/p>\n<p>Ma per arrivare a un attrezzo concreto, dobbiamo cominciare da qualche parte, giusto? Quindi inizier\u00f2 dal livello pi\u00f9 alto possibile e lavorer\u00f2 verso il basso.<\/p>\n<p>Come puoi vedere nell&#8217;immagine sopra, hai un paio di archivi dati che vengono tutti letti tramite il repository, quindi l&#8217;applicazione interroga il repository che, a sua volta, recupera le informazioni dal datastore.<\/p>\n<p>S\u00ec, ci sono opzioni per memorizzare nella cache le informazioni, invalidare la cache e tutte quelle cose divertenti. Ma \u00e8 al di fuori dell&#8217;ambito di un primario del repository. Quindi non ho intenzione di seguire quel particolare percorso per ora. Magari in un prossimo post (se questo dovesse esserti utile).<\/p>\n<h2>Il modello di repository in WordPress<\/h2>\n<p>Detto questo, diamo un&#8217;occhiata a un&#8217;implementazione di base di come potrebbe apparire in un&#8217;installazione standard di WordPress. Cio\u00e8, tutto ci\u00f2 che abbiamo \u00e8 l&#8217;archivio dati. Non stiamo comunicando con nient&#8217;altro, ma vogliamo assicurarci che tutto ci\u00f2 che si interfaccia con il database o l&#8217;API sia gestito dal repository<\/p>\n<p>Questo assomiglierebbe a questo:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a689f876.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a689f876.png\" alt=\"Il primer del modello di repository\" ><\/a><\/p>\n<p>Come potrebbe apparire con WordPress<\/p>\n<p>E questo pu\u00f2 essere ulteriormente astratto. Forse c&#8217;\u00e8 un repository di post o un repository di utenti. Personalmente, sono un fan dell&#8217;avere un repository per ogni tipo di entit\u00e0 perch\u00e9 aiuta a contenere la logica aziendale correlata senza creare quelle grandi classi che sanno tutto (e inutilmente).<\/p>\n<p>Quindi questo potrebbe assomigliare a questo:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a6e78654.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a6e78654.png\" alt=\"Il primer del modello di repository\" ><\/a><\/p>\n<p>Un pacchetto di repository<\/p>\n<p>Quindi saliamo di un altro livello e diciamo che stai lavorando con l&#8217;API di Twitter, l&#8217;API ZenDesk, l&#8217;API utente di WordPress e l&#8217;API Post di WordPress. Allora cosa? Ci sono pi\u00f9 repository.<\/p>\n<p>Forse sono contenuti nel loro spazio dei nomi (come dovrebbero essere), forse stanno implementando un&#8217;interfaccia comune (per la quale esiste un caso per questo), ma durante il tempo di sviluppo, penso che sia importante indicare esplicitamente quale repository stai usando quindi per essere il pi\u00f9 chiaro possibile.<\/p>\n<p>Cio\u00e8, non usare un generico e lascia che il runtime lo capisca:<\/p>\n<pre><code>$support_repository = new Support_Repository();\n$support_repository-&gt;get_tickets_for( 'tommcfarlin' );<\/code><\/pre>\n<p>Invece, sii esplicito:<\/p>\n<pre><code>$zendesk_repository = new ZenDesk_Repository();\n$zendesk_repository-&gt;get_tickets_from( 'yesterday' );<\/code><\/pre>\n<p>Questo potrebbe sembrare molto. Non so se lo si verifica, ma c&#8217;\u00e8 una strana sensazione nella programmazione orientata agli oggetti in cui vogliamo creare le classi piccole e mirate ma crea molti file.<\/p>\n<p>Quindi hai questi file ben impostati, ognuno dei quali sta facendo qualcosa di piccolo e mirato. Non lasciare che il numero di file che compongono un progetto dia l&#8217;impressione di avere un&#8217;architettura scadente.<\/p>\n<h2>Conclusione<\/h2>\n<p>Questo \u00e8 il primer sul pattern del repository. Naturalmente, c&#8217;\u00e8 del codice che va di pari passo con questo, ma prima di immergermi in quella parte, perch\u00e9 il codice \u00e8 dove le cose che si perdono facilmente nella traduzione, volevo assicurarmi di aver contribuito a fornire un&#8217;illustrazione per sviluppare un modello concettuale di come funziona il modello.<\/p>\n<p>Da qui, possiamo iniziare a parlare di un&#8217;implementazione del pattern. Quindi nel prossimo post o nei prossimi due post, far\u00f2 esattamente questo.<\/p>\n<p>Nel frattempo, non esitate a lasciare commenti o domande su ci\u00f2 che abbiamo trattato qui.<\/p>\n<h2>Lettura correlata<\/h2>\n<ul>\n<li><a href=\"https:\/\/8thlight.com\/blog\/mike-ebert\/2013\/03\/23\/the-repository-pattern.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Il modello di repository tramite 8th Light<\/a><\/li>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ff649690.aspx\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Il modello di repository tramite MSDN<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/clean\/repository\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Un&#8217;implementazione del modello di repository<\/a><\/li>\n<\/ul>\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>L&#8217;implementazione del pattern del repository non \u00e8 terribilmente difficile, ma vale la pena rivedere un primer del repository prima di passare a qualsiasi codice.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[918,896,720,844],"tags":[1168],"class_list":["post-229739","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229739","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=229739"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/229739\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=229739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=229739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=229739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}