{"id":230459,"date":"2022-11-22T15:17:00","date_gmt":"2022-11-22T12:17:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230459"},"modified":"2022-11-22T15:17:11","modified_gmt":"2022-11-22T12:17:11","slug":"classi-astratte-parte-2-classi-astratte-e-interfacce","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/classi-astratte-parte-2-classi-astratte-e-interfacce\/","title":{"rendered":"Classi astratte, parte 2 \u2013 Classi astratte e interfacce"},"content":{"rendered":"\n<p>Nel <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/classi-astratte-parte-1-comportamento-astratto\/\" title=\"post precedente\">post precedente<\/a><\/strong> di questa serie, ho esaminato:<\/p>\n<ul>\n<li>le basi delle classi astratte,<\/li>\n<li>come implementarli,<\/li>\n<li>e fornito esempi di codice funzionante.<\/li>\n<\/ul>\n<p>E anche se penso che la comprensione delle classi astratte sia la chiave per gettare solide basi per la programmazione orientata agli oggetti, vedo spesso che pu\u00f2 creare confusione quando si tratta di confrontarle con le interfacce e sapere quando usarle.<\/p>\n<h2>Classi astratte e interfacce<\/h2>\n<p>Quindi, in questo post, condivider\u00f2:<\/p>\n<ul>\n<li>un rapido aggiornamento su cosa sono le interfacce,<\/li>\n<li>cosa sono le classi astratte,<\/li>\n<li>e poi come sapere quando usarne uno sull&#8217;altro.<\/li>\n<\/ul>\n<p>Questo non dovrebbe essere un articolo ad alta intensit\u00e0 di codice, ma dovrebbe aiutare a sapere quando scrivere codice di un certo tipo per organizzare meglio i tuoi progetti.<\/p>\n<h3>1 Interfacce<\/h3>\n<p>Ricordiamo che quando si parla di interfacce, usiamo anche il termine &quot;programmazione su un&#8217;interfaccia&quot; con l&#8217;idea che l&#8217;interfaccia definisce i metodi che una classe deve implementare per adempiere al &quot;contratto&quot; con detta interfaccia.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Il codice<\/a> utilizzato per dimostrare un&#8217;interfaccia di base era:<\/p>\n<pre><code>&lt;?php\n\ninterface iCache \n{\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n<\/code><\/pre>\n<p>Ma ricorda, lo scopo dell&#8217;interfaccia non \u00e8 definire dopo che il codice \u00e8 stato scritto. Invece, \u00e8 uno strumento utilizzato per progettare ci\u00f2 che le classi dovrebbero implementare se seguono un determinato paradigma o se richiedono un determinato insieme di funzioni.<\/p>\n<p>Cio\u00e8, se hai intenzione di progettare un insieme di classi che funzionano con la memorizzazione nella cache, non scrivi prima le classi. Prima scrivi l&#8217;interfaccia, quindi le classi implementano detta interfaccia.<\/p>\n<p>L&#8217;idea \u00e8 che tutte le classi che implementano l&#8217;interfaccia avranno tali funzioni.<\/p>\n<h3>2 Classi astratte<\/h3>\n<p>Le classi astratte, invece, ci permettono di fare <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5b2936875807f041e98a87f8a5627e8b#file-00-taxonomy-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">due cose:<\/a><\/strong><\/p>\n<ol>\n<li>implementare funzionalit\u00e0 che possono essere utilizzate dalle sottoclassi,<\/li>\n<li>implementare le firme dei metodi che le sottoclassi devono implementare.<\/li>\n<\/ol>\n<p>Questo potrebbe sembrare un po &#8216;incongruente all&#8217;inizio, ma considera questo:<\/p>\n<p>Quando hai una classe di un certo tipo che avr\u00e0 funzionalit\u00e0 coerenti indipendentemente dalla sottoclasse, la funzionalit\u00e0 va nella classe astratta. Quando altri metodi devono avere la loro implementazione di un metodo, devi semplicemente fornire la firma del metodo e contrassegnarla come <strong>abstract<\/strong>.<\/p>\n<p>Ecco un esempio di un <strong><a href=\"https:\/\/wordpress.mediadoma.com\/it\/classi-astratte-parte-1-comportamento-astratto\/\" title=\"post precedente:\">post precedente:<\/a><\/strong><\/p>\n<p>Ora, questo ci cattura tutti dagli esempi precedenti e dalle cose precedenti su cui dobbiamo concentrarci per quanto riguarda le interfacce e le classi astratte, ma per alcuni questo non fornisce ancora molta chiarezza.<\/p>\n<p>In particolare, questo ancora non risponde alla domanda: come decidiamo quando usare una classe astratta e quando usare un&#8217;interfaccia?<\/p>\n<p>In apparenza, pu\u00f2 sembrare un po&#8217; confuso, ma ci sono alcune cose che puoi usare per prendere una decisione.<\/p>\n<h2>Quando li usiamo ciascuno?<\/h2>\n<p>Ricorda che quando si tratta di programmazione orientata agli oggetti, possiamo suddividerla in tre modi distinti:<\/p>\n<ul>\n<li>Le lezioni rappresentano una cosa. Puoi considerarli un sostantivo.<\/li>\n<li>Gli attributi o le propriet\u00e0 sono come gli aggettivi. Descrivono l&#8217;oggetto o qualcosa che l&#8217;oggetto pu\u00f2 contenere.<\/li>\n<li>I metodi o le funzioni sono come i verbi. Descrivono cosa possono fare gli oggetti.<\/li>\n<\/ul>\n<p>Ora, quando si tratta di un&#8217;interfaccia, pensa a cosa fa l&#8217;interfaccia: descrive, senza implementazione, cosa pu\u00f2 fare un oggetto. E quando si tratta di una classe astratta, descrive cos&#8217;\u00e8 un oggetto durante il runtime.<\/p>\n<p>In altre parole, una buona regola pratica \u00e8 che se \u00e8 necessario fornire un insieme di comportamenti per un oggetto, un&#8217;interfaccia \u00e8 la strada da percorrere. Se hai bisogno di descrivere cos&#8217;\u00e8 un oggetto, usa una classe astratta.<\/p>\n<p>Per le classi astratte, farei anche un ulteriore passo avanti e direi che aiuta a descrivere un livello base di dati che descrive un oggetto o cosa potrebbe memorizzare oltre a un livello base di funzionalit\u00e0.<\/p>\n<h3>Hai un esempio?<\/h3>\n<p>Come con la maggior parte del contenuto in ciascuno di questi post, provo a fornire esempi anche se non \u00e8 specificamente fatto nel codice. Forse questo aiuter\u00e0 a spiegarlo ancora di pi\u00f9:<\/p>\n<ul>\n<li><strong>Le interfacce non hanno implementazione.<\/strong> Garantiscono solo ci\u00f2 che far\u00e0 una classe.<\/li>\n<li><strong>Le classi astratte dovrebbero avere un livello base di implementazione<\/strong>. Questo dovrebbe rappresentare ci\u00f2 che una classe pu\u00f2 tenere e fare ma non \u00e8 completo. Richiedono un po&#8217; pi\u00f9 di implementazione dalla sottoclasse.<\/li>\n<\/ul>\n<p>Quando lavori con codice orientato agli oggetti, spero che questo aiuti a fornire alcune linee guida su quando usare cosa. In caso contrario, non esitare a lasciare un commento (qualcosa che i membri hanno il permesso di fare :).<\/p>\n<p>Inoltre, lo vedremo in pratica quando arriveremo a scrivere codice orientato agli oggetti (in particolare per WordPress, ma non sempre).<\/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>Comprendere la differenza tra classi e interfacce astratte \u00e8 importante quando si scrive codice orientato agli oggetti.<\/p>\n","protected":false},"author":1,"featured_media":164774,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[896,720,844],"tags":[1168],"class_list":["post-230459","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-sviluppatore","category-tutorial","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230459","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=230459"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230459\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/164774"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}