{"id":229834,"date":"2022-11-21T11:47:00","date_gmt":"2022-11-21T08:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229834"},"modified":"2022-11-21T17:42:36","modified_gmt":"2022-11-21T14:42:36","slug":"programacion-orientada-a-objetos-comprension-de-las-interfaces","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/programacion-orientada-a-objetos-comprension-de-las-interfaces\/","title":{"rendered":"Programaci\u00f3n orientada a objetos: comprensi\u00f3n de las interfaces"},"content":{"rendered":"\n<p>En este punto, dir\u00eda que se han sentado las bases para comprender la programaci\u00f3n orientada a objetos.<\/p>\n<p>Espec\u00edficamente, he cubierto:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-dos-primeros-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"Abstracci\u00f3n\">Abstracci\u00f3n<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-dos-primeros-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"Encapsulaci\u00f3n\">Encapsulaci\u00f3n<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-segundos-dos-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"Herencia\">Herencia<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-segundos-dos-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"Polimorfismo\">Polimorfismo<\/a><\/li>\n<\/ol>\n<p>Y, s\u00ed, hay cierto debate sobre lo que constituye los cimientos (es decir, algunos no agregan polimorfismo a la mezcla, aunque yo s\u00ed). Pero los cuatro anteriores deber\u00edan proporcionar una base s\u00f3lida a partir de la cual continuar desarrollando sus habilidades de programaci\u00f3n orientada a objetos.<\/p>\n<p>Hay m\u00e1s, pero no creo que sean tan profundos, detallados o dif\u00edciles de entender como algunos de los conceptos antes mencionados. Por otra parte, las cosas diferentes son m\u00e1s f\u00e1ciles para los dem\u00e1s.<\/p>\n<p>En cualquier caso, los siguientes dos temas que es importante entender son:<\/p>\n<ol>\n<li>Interfaces<\/li>\n<li>Abstracci\u00f3n<\/li>\n<\/ol>\n<p>Hablar\u00e9 de cada uno por separado, pero aseg\u00farese de haber le\u00eddo primero la serie <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fundamentos<\/a> porque los dos temas anteriores le permitir\u00e1n confiar en ellos y aprovecharlos.<\/p>\n<p>Vago, lo s\u00e9, pero d\u00e9jame explicarte y luego seguir desde all\u00ed.<\/p>\n<h2>Comprender las interfaces<\/h2>\n<p>Con mucho, la definici\u00f3n m\u00e1s com\u00fan de una interfaz que es probable que escuche es que es un contrato. Esto no est\u00e1 mal, pero creo que deja mucho que desear.<\/p>\n<p>Por ejemplo, cuando piensa en contratos, es probable que piense en algo muy complicado, mucha jerga, un proceso complicado para firmar, fechar, preparar algo para trabajar y continuar.<\/p>\n<p>Pero cuando se trata de interfaces de programaci\u00f3n, este no es realmente el caso. De hecho, dir\u00eda que definir interfaces puede facilitar la programaci\u00f3n y alivia muchos tr\u00e1mites burocr\u00e1ticos porque hace que las cosas sean muy negras o blancas en cuanto a lo que algo deber\u00eda implementar.<\/p>\n<h3>Una palabra sobre &quot;interfaces&quot;<\/h3>\n<p>Nuestra industria usa la palabra &quot;interfaz&quot; para dos cosas:<\/p>\n<ul>\n<li>Los dise\u00f1adores y usuarios usan el t\u00e9rmino interfaz para describir lo que ven y c\u00f3mo interact\u00faan con la aplicaci\u00f3n. Esto incluye cosas como botones, men\u00fas desplegables y otros elementos que podemos &quot;tocar&quot;.<\/li>\n<li>Los programadores usan el t\u00e9rmino para referirse a qu\u00e9 funciones debe implementar una subclase para adherirse a una interfaz. Esto se denomina &quot;programaci\u00f3n en una interfaz&quot;.<\/li>\n<\/ul>\n<p>Esto \u00faltimo es lo que se va a discutir en este art\u00edculo. Y no, no vamos a usar ejemplos t\u00edpicos como programar una interfaz <strong>Animal o lo que sea.<\/strong> En su lugar, veremos c\u00f3mo hacerlo a partir de ejemplos de c\u00f3digo reales.<\/p>\n<h3>Programaci\u00f3n a una interfaz<\/h3>\n<p>Definimos &quot;programar en una interfaz&quot; como una forma de escribir c\u00f3digo que implemente las firmas de las funciones definidas en dicha interfaz.<\/p>\n<p>Pero, \u00bfqu\u00e9 son las firmas de m\u00e9todos? En pocas palabras, las firmas de m\u00e9todos incluyen:<\/p>\n<ul>\n<li>el nombre del nombre de la funci\u00f3n,<\/li>\n<li>los argumentos que necesita,<\/li>\n<li>el modificador de visibilidad<\/li>\n<\/ul>\n<p>En el contexto de una clase, lo ver\u00e1s <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-00-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed:<\/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, \u00bfverdad?<\/p>\n<p>En el c\u00f3digo anterior, podemos ver que la funci\u00f3n <strong>set<\/strong> acepta una <strong>clave<\/strong> y un <strong>valor<\/strong> que se usar\u00e1 y cualquier objeto que tenga una referencia a la clase puede acceder a la funci\u00f3n.<\/p>\n<p>Pero las interfaces tambi\u00e9n pueden incluir esto. Sin embargo, hay una advertencia: las interfaces no tienen implementaci\u00f3n de m\u00e9todos.<\/p>\n<p>Entonces, en lugar de algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-01-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como esto:<\/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>Ver\u00e1s <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esto:<\/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>Pero tambi\u00e9n hay un par de sutilezas a tener en cuenta en el c\u00f3digo anterior.<\/p>\n<ul>\n<li>Este c\u00f3digo no lo define como una clase. En cambio, lo llama una <strong>interfaz<\/strong>.<\/li>\n<li>El nombre de la clase tiene como prefijo una &#8216;i&#8217; para indicar que es una interfaz. Esto no es obligatorio; es una convenci\u00f3n.<\/li>\n<li>El m\u00e9todo no tiene implementaci\u00f3n. No tiene nada m\u00e1s que una firma.<\/li>\n<\/ul>\n<p>Cuando creamos una interfaz, decimos, como se mencion\u00f3 anteriormente, que cualquier clase que implemente la interfaz definir\u00e1 los m\u00e9todos que incluye.<\/p>\n<p>Entonces, si tuvi\u00e9ramos que unir todo lo que hemos visto anteriormente, la implementaci\u00f3n final se ver\u00eda <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-03-simplecache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/a> (aunque lo ideal ser\u00eda mantener esto en archivos 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>Y as\u00ed es como encajan las interfaces y las clases.<\/p>\n<h2>\u00bfEso es todo?<\/h2>\n<p>En t\u00e9rminos simples, s\u00ed. Pero en mi experiencia, descubr\u00ed que hay m\u00e1s que simplemente definir los m\u00e9todos e implementarlos.<\/p>\n<p>A menudo, es f\u00e1cil definir clases, luego definir la interfaz y luego implementar la interfaz. Pero eso es <strong>completamente<\/strong> al rev\u00e9s. En cambio, necesitamos pensar m\u00e1s estrat\u00e9gicamente sobre nuestro trabajo.<\/p>\n<p>En lugar de retroceder a una interfaz, lo que frustra por completo el prop\u00f3sito, debemos comenzar de manera amplia para que nuestras clases puedan especializarse en lo que hacen mientras implementan la funcionalidad que es com\u00fan no solo para esa clase sino tambi\u00e9n para otras clases que pueden necesitar la misma funcionalidad.<\/p>\n<p>Usando el ejemplo anterior, podemos tener un <strong>SimpleCache<\/strong>, un <strong>TransientCache<\/strong> o alg\u00fan otro tipo de cach\u00e9. Independientemente del tipo de cach\u00e9 que implementemos, implementar\u00e1n la interfaz y la funcionalidad se dejar\u00e1 a la clase que implementa la interfaz.<\/p>\n<p>As\u00ed que definimos c\u00f3mo se ver\u00eda un cach\u00e9 en un nivel alto, pero las clases de implementaci\u00f3n definir\u00e1n exactamente c\u00f3mo funcionan.<\/p>\n<hr \/>\n<p>Si es un desarrollador de WordPress y est\u00e1 buscando aprender c\u00f3mo construir cosas sobre la aplicaci\u00f3n utilizando t\u00e9cnicas pr\u00e1cticas orientadas a objetos, <a href=\"https:\/\/tommcfarlin.com\/registration-info\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00bfpor qu\u00e9 no unirse al sitio?<\/a><\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <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 definici\u00f3n de una interfaz de programaci\u00f3n es que es un contrato. Creo que deja mucho que desear a la hora de entender las 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":[892,716,840],"tags":[1172],"class_list":["post-229834","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229834","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229834"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229834\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/164880"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229834"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229834"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}