{"id":230181,"date":"2022-11-21T11:30:00","date_gmt":"2022-11-21T08:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230181"},"modified":"2022-11-21T17:07:29","modified_gmt":"2022-11-21T14:07:29","slug":"programacao-orientada-a-objetos-entendendo-interfaces","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/programacao-orientada-a-objetos-entendendo-interfaces\/","title":{"rendered":"Programa\u00e7\u00e3o Orientada a Objetos: Entendendo Interfaces"},"content":{"rendered":"\n<p>Neste ponto, eu diria que os fundamentos da compreens\u00e3o da programa\u00e7\u00e3o orientada a objetos foram estabelecidos.<\/p>\n<p>Especificamente, eu cobri:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-dois-primeiros-pilares-da-poo\/\" title=\"Abstra\u00e7\u00e3o\">Abstra\u00e7\u00e3o<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-dois-primeiros-pilares-da-poo\/\" title=\"Encapsulamento\">Encapsulamento<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-segundos-dois-pilares-da-poo\/\" title=\"Heran\u00e7a\">Heran\u00e7a<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-segundos-dois-pilares-da-poo\/\" title=\"Polimorfismo\">Polimorfismo<\/a><\/li>\n<\/ol>\n<p>E, sim, h\u00e1 algum debate sobre o que constitui os fundamentos (ou seja, alguns n\u00e3o jogam polimorfismo na mistura, embora eu o fa\u00e7a). Mas os quatro acima devem fornecer uma base s\u00f3lida para continuar desenvolvendo suas habilidades de programa\u00e7\u00e3o orientada a objetos.<\/p>\n<p>Existem mais, mas n\u00e3o acho que sejam t\u00e3o profundos, detalhados ou dif\u00edceis de entender quanto alguns dos conceitos mencionados acima. Ent\u00e3o, novamente, coisas diferentes s\u00e3o mais f\u00e1ceis para os outros.<\/p>\n<p>De qualquer forma, os pr\u00f3ximos dois t\u00f3picos que s\u00e3o importantes para entender s\u00e3o:<\/p>\n<ol>\n<li>Interfaces<\/li>\n<li>Abstra\u00e7\u00e3o<\/li>\n<\/ol>\n<p>Falarei sobre cada um separadamente, mas certifique-se de ler primeiro a s\u00e9rie <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fundamentos<\/a>, pois os dois t\u00f3picos acima permitir\u00e3o que voc\u00ea confie neles e tire proveito deles.<\/p>\n<p>Vago, eu sei, mas deixe-me explicar e depois partir da\u00ed.<\/p>\n<h2>Entendendo as interfaces<\/h2>\n<p>De longe, a defini\u00e7\u00e3o mais comum de interface que voc\u00ea provavelmente ouvir\u00e1 \u00e9 que \u00e9 um contrato. Isso n\u00e3o \u00e9 errado, mas acho que deixa muito a desejar.<\/p>\n<p>Por exemplo, quando voc\u00ea pensa em contratos, provavelmente pensa em algo muito envolvente, muito jarg\u00e3o, um processo complicado de obter algo assinado, datado, pronto para funcionar e assim por diante.<\/p>\n<p>Mas quando se trata de interfaces de programa\u00e7\u00e3o, esse n\u00e3o \u00e9 o caso. Na verdade, eu diria que definir interfaces pode tornar a programa\u00e7\u00e3o mais f\u00e1cil e alivia muito a burocracia porque torna as coisas muito pretas ou brancas quanto ao que algo deve implementar.<\/p>\n<h3>Uma palavra sobre &#8220;interfaces&quot;<\/h3>\n<p>Nossa ind\u00fastria usa a palavra &#8220;interface&#8221; para duas coisas:<\/p>\n<ul>\n<li>Designers e usu\u00e1rios usam o termo interface para descrever o que veem e como interagem com o aplicativo. Isso inclui coisas como bot\u00f5es, listas suspensas e outros elementos que podemos &#8220;tocar&#8221;.<\/li>\n<li>Os programadores usam o termo para se referir a quais fun\u00e7\u00f5es uma subclasse deve implementar para aderir a uma interface. Isso \u00e9 chamado de &#8220;programa\u00e7\u00e3o para uma interface&#8221;.<\/li>\n<\/ul>\n<p>Este \u00faltimo \u00e9 o que ser\u00e1 discutido neste artigo. E n\u00e3o, n\u00e3o vamos usar exemplos t\u00edpicos como programa\u00e7\u00e3o para uma interface <strong>Animal ou qualquer outra coisa.<\/strong> Em vez disso, veremos como fazer isso a partir de exemplos de c\u00f3digo reais.<\/p>\n<h3>Programa\u00e7\u00e3o para uma interface<\/h3>\n<p>Definimos &#8220;programa\u00e7\u00e3o para uma interface&#8221; como uma forma de escrevermos c\u00f3digo que implemente as assinaturas de fun\u00e7\u00f5es definidas na referida interface.<\/p>\n<p>Mas o que s\u00e3o assinaturas de m\u00e9todos? Simplificando, as assinaturas de m\u00e9todo incluem:<\/p>\n<ul>\n<li>o nome do nome da fun\u00e7\u00e3o,<\/li>\n<li>os argumentos necess\u00e1rios,<\/li>\n<li>o modificador de visibilidade<\/li>\n<\/ul>\n<p>No contexto de uma classe, voc\u00ea a ver\u00e1 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-00-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/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>F\u00e1cil, certo?<\/p>\n<p>No c\u00f3digo acima, podemos ver que a fun\u00e7\u00e3o <strong>set<\/strong> aceita uma <strong>chave<\/strong> e um <strong>valor<\/strong> que ser\u00e1 utilizado e a fun\u00e7\u00e3o \u00e9 acess\u00edvel por qualquer objeto que tenha refer\u00eancia \u00e0 classe.<\/p>\n<p>Mas as interfaces tamb\u00e9m podem incluir isso. Por\u00e9m, h\u00e1 uma ressalva: as interfaces n\u00e3o t\u00eam implementa\u00e7\u00e3o de m\u00e9todo.<\/p>\n<p>Ent\u00e3o, ao inv\u00e9s de algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-01-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/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>Voc\u00ea ver\u00e1 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">isso:<\/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>Mas tamb\u00e9m h\u00e1 algumas sutilezas a serem observadas no c\u00f3digo acima.<\/p>\n<ul>\n<li>Este c\u00f3digo n\u00e3o o define como uma classe. Em vez disso, ele o chama de <strong>interface<\/strong>.<\/li>\n<li>O nome da classe \u00e9 prefixado com um &#8216;i&#8217; para indicar que \u00e9 uma interface. Isso n\u00e3o \u00e9 necess\u00e1rio; \u00e9 uma conven\u00e7\u00e3o.<\/li>\n<li>O m\u00e9todo n\u00e3o tem implementa\u00e7\u00e3o. N\u00e3o tem nada al\u00e9m de uma assinatura.<\/li>\n<\/ul>\n<p>Quando criamos uma interface, estamos dizendo, como mencionado acima, que qualquer classe que implemente a interface definir\u00e1 os m\u00e9todos que ela inclui.<\/p>\n<p>Ent\u00e3o, se tiv\u00e9ssemos que unir tudo o que vimos acima, a implementa\u00e7\u00e3o final ficaria <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-03-simplecache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> (embora idealmente mantiv\u00e9ssemos isso em arquivos separados):<\/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>E \u00e9 assim que interfaces e classes se encaixam.<\/p>\n<h2>\u00c9 isso?<\/h2>\n<p>Em termos simples, sim. Mas na minha experi\u00eancia, descobri que h\u00e1 mais do que simplesmente definir os m\u00e9todos e implement\u00e1-los.<\/p>\n<p>Muitas vezes, \u00e9 f\u00e1cil definir classes, depois definir a interface e depois implementar a interface. Mas isso \u00e9 <strong>completamente<\/strong> para tr\u00e1s. Em vez disso, precisamos pensar mais estrategicamente sobre nosso trabalho.<\/p>\n<p>Em vez de recorrer a uma interface, o que anula completamente o prop\u00f3sito, precisamos come\u00e7ar de forma ampla para que nossas classes possam se especializar no que fazem ao mesmo tempo em que implementam funcionalidades comuns n\u00e3o apenas a essa classe, mas a outras classes que podem precisar da mesma funcionalidade.<\/p>\n<p>Usando o exemplo acima, podemos ter um <strong>SimpleCache<\/strong>, um <strong>TransientCache<\/strong> ou algum outro tipo de cache. Independentemente do tipo de cache que implementamos, eles implementar\u00e3o a interface e a funcionalidade ser\u00e1 deixada para a classe que implementa a interface.<\/p>\n<p>Assim, definimos como um cache pode parecer em alto n\u00edvel, mas as classes de implementa\u00e7\u00e3o definir\u00e3o exatamente como eles funcionam.<\/p>\n<hr \/>\n<p>Se voc\u00ea \u00e9 um desenvolvedor WordPress e quer aprender a construir coisas em cima do aplicativo usando t\u00e9cnicas pr\u00e1ticas e orientadas a objetos, ent\u00e3o <a href=\"https:\/\/tommcfarlin.com\/registration-info\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">por que n\u00e3o entrar no site?<\/a><\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma defini\u00e7\u00e3o de interface de programa\u00e7\u00e3o \u00e9 que \u00e9 um contrato. Acho que deixa muito a desejar na hora de entender as interfaces.<\/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":[898,722,846],"tags":[1170],"class_list":["post-230181","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230181"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230181\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/164880"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}