{"id":229921,"date":"2022-11-23T19:49:00","date_gmt":"2022-11-23T16:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229921"},"modified":"2022-11-23T19:49:27","modified_gmt":"2022-11-23T16:49:27","slug":"mirando-el-polimorfismo-en-profundidad","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/mirando-el-polimorfismo-en-profundidad\/","title":{"rendered":"Mirando el polimorfismo en profundidad"},"content":{"rendered":"\n<p>Cuando comenc\u00e9 esta serie, habl\u00e9 sobre los cuatro pilares de la programaci\u00f3n orientada a objetos. Cada uno de estos temas se enumeran y vinculan a continuaci\u00f3n.<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-dos-primeros-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"Abstracci\u00f3n\">Abstracci\u00f3n<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-dos-primeros-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"Encapsulaci\u00f3n\">Encapsulaci\u00f3n<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-segundos-dos-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"Herencia\">Herencia<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-segundos-dos-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"Polimorfismo\">Polimorfismo<\/a><\/strong><\/li>\n<\/ol>\n<p>En este punto, normalmente me gustar\u00eda comenzar a pasar al siguiente tema. Sin embargo, antes de hacerlo, me gustar\u00eda pasar una publicaci\u00f3n m\u00e1s explorando el concepto de polimorfismo.<\/p>\n<p>En mi carrera, hasta ahora, he visto pocos temas que les den a quienes se inician en la programaci\u00f3n orientada a objetos m\u00e1s confusi\u00f3n y problemas que el polimorfismo. As\u00ed que me gustar\u00eda discutirlo un poco m\u00e1s en profundidad dentro del contexto de la programaci\u00f3n orientada a objetos y fuera de cualquier marco o aplicaci\u00f3n en particular (como WordPress).<\/p>\n<p>En esta publicaci\u00f3n, har\u00e9 una revisi\u00f3n r\u00e1pida de lo que hemos discutido hasta ahora, luego volver\u00e9 al polimorfismo.<\/p>\n<h2>Polimorfismo en profundidad<\/h2>\n<p>Primero, como se mencion\u00f3, quiero revisar r\u00e1pidamente lo que se ha discutido hasta ahora, especialmente si ha pasado por alto alguna de las publicaciones anteriores.<\/p>\n<p>No se preocupe: nada a continuaci\u00f3n se desv\u00eda del c\u00f3digo. En cambio, simplemente define los t\u00e9rminos que hemos usado para que tenga una idea de a qu\u00e9 me refiero cada vez que vea la palabra surgir a lo largo de esta serie.<\/p>\n<h3>Abstracci\u00f3n<\/h3>\n<blockquote>\n<p>Abstraemos la idea de algo en una clase. En cambio, vamos a abstraer ideas en sus clases. Y aqu\u00ed hay una idea clave: una clase debe representar un sustantivo.<\/p>\n<\/blockquote>\n<h3>Encapsulaci\u00f3n<\/h3>\n<blockquote>\n<p>La encapsulaci\u00f3n es realmente solo una palabra &quot;grande&quot; que se refiere a la idea de administrar sus responsabilidades (o realizar un seguimiento de sus datos).<\/p>\n<\/blockquote>\n<h3>Herencia<\/h3>\n<blockquote>\n<p>La herencia se refiere a la idea de que una clase, aunque tiene su propia implementaci\u00f3n, literalmente hereda propiedades, funciones e implementaci\u00f3n general de una clase principal.<\/p>\n<\/blockquote>\n<h3>Polimorfismo<\/h3>\n<blockquote>\n<p>El polimorfismo nos permite referirnos a una clase de un tipo cuando puede declararse como de otro tipo.<\/p>\n<\/blockquote>\n<p>Dicho esto, aqu\u00ed es donde creo que las cosas pueden complicarse un poco m\u00e1s. En las publicaciones anteriores, proporcion\u00e9 una serie de ejemplos de c\u00f3digo diferentes (y le insto a que los revise).<\/p>\n<p>Pero en la publicaci\u00f3n de hoy, voy a tratar de explorar la idea un poco m\u00e1s, tanto en la explicaci\u00f3n como en el c\u00f3digo.<\/p>\n<h2>Relativo a la herencia<\/h2>\n<p>Si no es evidente en este punto, el polimorfismo est\u00e1 muy relacionado con la herencia. Pi\u00e9nselo de esta manera: si una clase hereda propiedades y m\u00e9todos de otra clase, entonces puede &quot;reemplazar&quot; a la clase principal.<\/p>\n<p>Eso significa que si tiene algo como una\u00a0 clase de <strong>contenido<\/strong> y luego tiene dos subclases, una es una <strong>publicaci\u00f3n<\/strong> y otra es una <strong>p\u00e1gina<\/strong>, puede crear una instancia de la clase utilizando el\u00a0 tipo de referencia de <strong>contenido .<\/strong><\/p>\n<p>Pero en tiempo de ejecuci\u00f3n, en realidad ser\u00e1 una instancia del\u00a0 tipo <strong>Post<\/strong>. \u00bfTener sentido? Aqu\u00ed hay un c\u00f3digo como ejemplo.<\/p>\n<p>Primero, comenzaremos con la definici\u00f3n de una\u00a0 clase de <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-00-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">contenido<\/a> :<\/p>\n<pre><code>&lt;?php\nclass Content {\n\n   protected $title;\n\n   protected $content;\n\n   protected $metadata;\n\n   public function __construct()\n   {\n     $this-&gt;title = \"Hello World!\";\n     $this-&gt;content = \"This is a sample piece of content.\";\n     $this-&gt;metadata = \"&lt;This is the metadata of the post.&gt;\";\n   }\n\n   public function getTitle()\n   {\n     return $this-&gt;title;\n   }\n\n   public function getContent()\n   {\n     return $this-&gt;content;\n   }\n\n   public function getMetadata()\n   {\n     return $this-&gt;metadata;\n   }\n }\n<\/code><\/pre>\n<p>Tiene las propiedades generales que probablemente espera: t\u00edtulo, contenido y metadatos. Por supuesto, estas propiedades son solo cadenas, pero podr\u00edan ser estructuras de datos m\u00e1s elaboradas en una situaci\u00f3n del mundo real.<\/p>\n<p>Ahora veamos una <strong>publicaci\u00f3n<\/strong> :<\/p>\n<pre><code>&lt;?php\n\nclass Post extends Content  {\n\n   private $author;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;author = \"Tom McFarlin\";\n   }\n\n   public function getAuthor()\n   {\n     return $this-&gt;author;\n   }\n }\n<\/code><\/pre>\n<p>Entonces, \u00bfqu\u00e9 sucede si llama a un m\u00e9todo en la\u00a0 clase <strong>Post<\/strong>, como <strong>getTitle<\/strong>, que no existe pero existe en la\u00a0 clase <strong>Content<\/strong>? Luego, debido a la herencia, buscar\u00e1 el m\u00e9todo en <strong>Post<\/strong>, no lo encontrar\u00e1, luego comenzar\u00e1 a buscarlo en <strong>Content<\/strong>.<\/p>\n<p>Si lo encuentra, lo ejecutar\u00e1.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6c3e3d0.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-164720-61e76b6c3e3d0.png\" alt=\"Mirando el polimorfismo en profundidad\"><\/a><\/p>\n<p>Del mismo modo, podemos hacer algo como esto con la\u00a0 clase de <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-02-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina<\/a> y los datos de contenido. Primero, instanciamos la clase base y luego establecemos las propiedades espec\u00edficas de la <strong>p\u00e1gina<\/strong>. En este caso, va a ser una categor\u00eda.<\/p>\n<pre><code>&lt;?php\n\nclass Page extends Content  {\n\n   private $category;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;category = \"Articles\";\n   }\n\n   public function getCategory()\n   {\n     return $this-&gt;category;\n   }\n }\n<\/code><\/pre>\n<p>Ahora, cuando ejecutamos el c\u00f3digo, podemos comenzar con el <strong>Contenido:<\/strong><\/p>\n<pre><code>&lt;?php\n\n$content = new Content();\necho $content-&gt;getTitle();<\/code><\/pre>\n<p>Tenga en cuenta que esto parece lo que esperar\u00edamos, ya que tenemos un t\u00edtulo y tenemos contenido. Veamos tambi\u00e9n el <strong>Post<\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>Esto funciona porque tenemos un autor pero tambi\u00e9n tenemos un t\u00edtulo porque reside en <strong>Contenido<\/strong>. \u00bfPero si tratamos de llamar a <strong>getAuthor<\/strong> en una instancia de <strong>Post?<\/strong><\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>Vamos a recibir un error porque el m\u00e9todo no reside en esa clase.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6f7949a.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-164720-61e76b6f7949a.png\" alt=\"Mirando el polimorfismo en profundidad\"><\/a><\/p>\n<p>Entonces, \u00bfqu\u00e9 vamos a hacer? Dado que no tenemos tipos fuertes en PHP, no podemos convertirlo en un tipo diferente.<\/p>\n<p>Hay patrones de dise\u00f1o para esto, que discutir\u00e9 en un futuro conjunto de publicaciones, pero PHP no lo permite tan f\u00e1cilmente como otros lenguajes (como C# o Java).<\/p>\n<h2>Preguntas sobre el polimorfismo<\/h2>\n<p>Con suerte, el c\u00f3digo anterior le dar\u00e1 una idea de c\u00f3mo un tipo concreto, como una <strong>publicaci\u00f3n\u00a0<\/strong> o una <strong>p\u00e1gina<\/strong>, puede tener impl\u00edcitamente las propiedades y los m\u00e9todos de su clase base, <strong>Content<\/strong>, que se usan en tiempo de ejecuci\u00f3n.<\/p>\n<p>Pero tambi\u00e9n plantea algunas preguntas, \u00bfno? Por ejemplo:<\/p>\n<ul>\n<li><strong>\u00bfPor qu\u00e9 es \u00fatil el polimorfismo?<\/strong> En \u00faltima instancia, es una cuesti\u00f3n de flexibilidad. Es decir, puede escribir un\u00a0 tipo de <strong>Contenido<\/strong> gen\u00e9rico y luego crear una <strong>Publicaci\u00f3n<\/strong> o una <strong>P\u00e1gina<\/strong> como hemos visto anteriormente. Esto nos brinda todos los beneficios de la\u00a0 clase <strong>Content<\/strong> y tambi\u00e9n nos brinda la especificidad de la\u00a0 clase <strong>Post<\/strong>, por ejemplo.<\/li>\n<li><strong>Esto parece ser m\u00e1s confuso que flexible.<\/strong> En cierto modo, es confuso porque el c\u00f3digo requiere un poco de seguimiento. Es decir, puede comenzar en la\u00a0 clase <strong>Publicar<\/strong> y tener que buscar lo que ofrece la clase <strong>Contenido .<\/strong> Por otro lado, tambi\u00e9n hace que sea muy f\u00e1cil introducir una nueva\u00a0 subclase de <strong>contenido<\/strong> y luego usarla cuando sea m\u00e1s adecuada en tiempo de ejecuci\u00f3n.<\/li>\n<\/ul>\n<p>En lo que respecta a las superclases y subclases, aqu\u00ed es donde entra en juego tener un IDE s\u00f3lido.<\/p>\n<p>Siempre es bueno tener un editor que te guste, claro, pero tener uno que pueda determinar intuitivamente cu\u00e1l es la clase principal, cu\u00e1l es la clase base, etc., puede ser de gran ayuda para rastrear, depurar, seguir y escribir nuevos c\u00f3digo.<\/p>\n<p>Pero eso es contenido para otra publicaci\u00f3n que vendr\u00e1 despu\u00e9s de que hablemos sobre patrones de dise\u00f1o.<\/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>Veamos el polimorfismo en profundidad para tener una idea m\u00e1s clara de c\u00f3mo funciona y por qu\u00e9 es beneficioso.<\/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":[892,716,800,840],"tags":[1172],"class_list":["post-229921","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-php-2","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229921","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=229921"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229921\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229921"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229921"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}