{"id":230406,"date":"2022-11-21T11:47:00","date_gmt":"2022-11-21T08:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230406"},"modified":"2022-11-21T16:52:27","modified_gmt":"2022-11-21T13:52:27","slug":"programmazione-orientata-agli-oggetti-comprensione-delle-interfacce","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/programmazione-orientata-agli-oggetti-comprensione-delle-interfacce\/","title":{"rendered":"Programmazione orientata agli oggetti: comprensione delle interfacce"},"content":{"rendered":"\n<p>A questo punto, direi che sono state gettate le basi per comprendere la programmazione orientata agli oggetti.<\/p>\n<p>Nello specifico ho trattato:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-primi-due-pilastri-di-oop\/\" title=\"Astrazione\">Astrazione<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-primi-due-pilastri-di-oop\/\" title=\"Incapsulamento\">Incapsulamento<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-secondi-due-pilastri-delloop\/\" title=\"Eredit\u00e0\">Eredit\u00e0<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/it\/i-secondi-due-pilastri-delloop\/\" title=\"Polimorfismo\">Polimorfismo<\/a><\/li>\n<\/ol>\n<p>E, s\u00ec, c&#8217;\u00e8 un dibattito su ci\u00f2 che costituisce le basi (cio\u00e8, alcuni non gettano il polimorfismo nel mix anche se lo faccio). Ma i quattro precedenti dovrebbero fornire una solida base su cui continuare a costruire le tue capacit\u00e0 di programmazione orientata agli oggetti.<\/p>\n<p>Ce ne sono altri, ma non penso che siano cos\u00ec profondi, dettagliati o difficili da capire come alcuni dei concetti sopra menzionati. Poi di nuovo, cose diverse diventano pi\u00f9 facili per gli altri.<\/p>\n<p>In ogni caso, i prossimi due argomenti che \u00e8 importante comprendere sono:<\/p>\n<ol>\n<li>Interfacce<\/li>\n<li>Astrazione<\/li>\n<\/ol>\n<p>Parler\u00f2 di ciascuno separatamente, ma assicurati di aver letto prima la serie <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fundamentals<\/a> perch\u00e9 i due argomenti precedenti ti permetteranno di fare affidamento su di essi e trarne vantaggio.<\/p>\n<p>Vago, lo so, ma lasciami spiegare e poi vai da l\u00ec.<\/p>\n<h2>Capire le interfacce<\/h2>\n<p>Di gran lunga, la definizione pi\u00f9 comune di un&#8217;interfaccia che probabilmente sentirai \u00e8 che si tratta di un contratto. Questo non \u00e8 sbagliato, ma penso che lasci molto a desiderare.<\/p>\n<p>Ad esempio, quando pensi ai contratti probabilmente pensi a qualcosa che \u00e8 molto coinvolto, molto gergo, un processo complicato per ottenere qualcosa firmato, datato, pronto per funzionare e cos\u00ec via.<\/p>\n<p>Ma quando si tratta di interfacce di programmazione, non \u00e8 proprio cos\u00ec. In effetti, direi che la definizione delle interfacce pu\u00f2 semplificare la programmazione e allevia molta burocrazia perch\u00e9 rende le cose molto nere o bianche su ci\u00f2 che qualcosa dovrebbe implementare.<\/p>\n<h3>Una parola sulle &quot;interfacce&quot;<\/h3>\n<p>Il nostro settore usa la parola &quot;interfaccia&quot; per due cose:<\/p>\n<ul>\n<li>Designer e utenti usano il termine interfaccia per descrivere cosa vedono e come interagiscono con l&#8217;applicazione. Ci\u00f2 include cose come pulsanti, menu a discesa e altri elementi che possiamo &quot;toccare&quot;.<\/li>\n<li>I programmatori usano il termine per riferirsi a quali funzioni una sottoclasse deve implementare per aderire a un&#8217;interfaccia. Questo \u00e8 chiamato &quot;programmazione su un&#8217;interfaccia&quot;.<\/li>\n<\/ul>\n<p>Quest&#8217;ultimo \u00e8 ci\u00f2 che verr\u00e0 discusso in questo articolo. E no, non useremo esempi tipici come la programmazione su un&#8217;interfaccia <strong>Animal<\/strong> o altro. Invece, vedremo di farlo da campioni di codice effettivi.<\/p>\n<h3>Programmazione su un&#8217;interfaccia<\/h3>\n<p>Definiamo &quot;programmazione su un&#8217;interfaccia&quot; come un modo per scrivere codice che implementa le firme delle funzioni definite in detta interfaccia.<\/p>\n<p>Ma cosa sono le firme dei metodi? In poche parole, le firme dei metodi includono:<\/p>\n<ul>\n<li>il nome del nome della funzione,<\/li>\n<li>gli argomenti che ci vogliono,<\/li>\n<li>il modificatore di visibilit\u00e0<\/li>\n<\/ul>\n<p>Nel contesto di una classe, la vedrai in <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-00-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo modo:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) \n  {\n    \/\/ method implementation\n  }\n}\n<\/code><\/pre>\n<p>Facile, vero?<\/p>\n<p>Nel codice sopra, possiamo vedere che la funzione <strong>set<\/strong> accetta una <strong>chiave<\/strong> e un <strong>valore<\/strong> che verranno utilizzati e la funzione \u00e8 accessibile da qualsiasi oggetto che ha un riferimento alla classe.<\/p>\n<p>Ma le interfacce possono anche includere questo. C&#8217;\u00e8 un avvertimento, per\u00f2: le interfacce non hanno l&#8217;implementazione del metodo.<\/p>\n<p>Quindi, invece di qualcosa del <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-01-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">genere:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) {\n    set_transient($key, $value);\n  }\n}\n<\/code><\/pre>\n<p>Vedrai <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questo:<\/a><\/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 ci sono anche un paio di sottigliezze da notare nel codice sopra.<\/p>\n<ul>\n<li>Questo codice non lo definisce come una classe. Invece, lo chiama <strong>un&#8217;interfaccia<\/strong>.<\/li>\n<li>Il nome della classe \u00e8 preceduto da una &#8216;i&#8217; per indicare che si tratta di un&#8217;interfaccia. Questo non \u00e8 richiesto; \u00e8 una convenzione<\/li>\n<li>Il metodo non ha implementazione. Non ha altro che una firma.<\/li>\n<\/ul>\n<p>Quando creiamo un&#8217;interfaccia, diciamo, come accennato in precedenza, che qualunque classe implementi l&#8217;interfaccia definir\u00e0 i metodi che include.<\/p>\n<p>Quindi, se dovessimo collegare tutto ci\u00f2 che abbiamo visto sopra, l&#8217;implementazione finale sarebbe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-03-simplecache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">simile a questa<\/a> (anche se idealmente lo terremmo in file separati):<\/p>\n<pre><code>&lt;?php\n\ninterface iCache {\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n\npublic class SimpleCache implemnents iCache\n{\n  public function set($key, $value)\n  {\n    set_transient($key, $value, DAY_IN_SECONDS);\n  }\n\n  public function get($key)\n  {\n    if (!$this-&gt;has($key))\n    {\n      return false;\n    }\n    return get_transient($key);\n  }\n\n  public function has($key)\n  {\n    return false !== get_transient($key);\n  }\n}\n<\/code><\/pre>\n<p>Ed \u00e8 cos\u00ec che le interfacce e le classi si integrano.<\/p>\n<h2>Questo \u00e8 tutto?<\/h2>\n<p>In parole povere, s\u00ec. Ma nella mia esperienza, ho scoperto che c&#8217;\u00e8 di pi\u00f9 che semplicemente definire i metodi e implementarli.<\/p>\n<p>Spesso \u00e8 facile definire le classi, quindi definire l&#8217;interfaccia, quindi implementare l&#8217;interfaccia. Ma questo \u00e8 <strong>completamente<\/strong> indietro. Invece, dobbiamo pensare in modo pi\u00f9 strategico al nostro lavoro.<\/p>\n<p>Invece di eseguire il backup in un&#8217;interfaccia, che vanifica completamente lo scopo, dobbiamo iniziare in modo ampio in modo che le nostre classi possano specializzarsi in ci\u00f2 che fanno mentre implementano funzionalit\u00e0 comuni non solo a quella classe ma ad altre classi che potrebbero aver bisogno della stessa funzionalit\u00e0.<\/p>\n<p>Usando l&#8217;esempio sopra, potremmo avere un <strong>SimpleCache<\/strong> un <strong>TransientCache<\/strong> o qualche altro tipo di cache. Indipendentemente dal tipo di cache che implementiamo, implementeranno l&#8217;interfaccia e la funzionalit\u00e0 sar\u00e0 lasciata alla classe che implementa l&#8217;interfaccia.<\/p>\n<p>Quindi definiamo come potrebbe apparire una cache ad alto livello, ma le classi di implementazione definiranno esattamente come funzionano.<\/p>\n<hr \/>\n<p>Se sei uno sviluppatore WordPress e stai cercando di imparare a costruire cose sopra l&#8217;applicazione usando tecniche pratiche e orientate agli oggetti, allora <a href=\"https:\/\/tommcfarlin.com\/registration-info\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">perch\u00e9 non unirti al sito?<\/a><\/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>Una definizione di interfaccia di programmazione \u00e8 che \u00e8 un contratto. Penso che lasci molto a desiderare nella comprensione delle interfacce.<\/p>\n","protected":false},"author":1,"featured_media":164880,"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-230406","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\/230406","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=230406"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/230406\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/164880"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=230406"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=230406"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=230406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}