{"id":229826,"date":"2022-11-21T17:36:00","date_gmt":"2022-11-21T14:36:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229826"},"modified":"2022-11-21T17:42:32","modified_gmt":"2022-11-21T14:42:32","slug":"los-segundos-dos-pilares-de-la-programacion-orientada-a-objetos","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/los-segundos-dos-pilares-de-la-programacion-orientada-a-objetos\/","title":{"rendered":"Los segundos dos pilares de la programaci\u00f3n orientada a objetos"},"content":{"rendered":"\n<p>Como mencion\u00e9 en <strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-dos-primeros-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"la primera publicaci\u00f3n de esta serie\">la primera publicaci\u00f3n de esta serie<\/a><\/strong>, a menudo escuchar\u00e1 sobre los tres pilares de la programaci\u00f3n orientada a objetos. Tambi\u00e9n puede escuchar acerca de Los Cuatro Pilares de la Programaci\u00f3n Orientada a Objetos.<\/p>\n<p>Y no es que haya un total de siete ni nada por el estilo. En cambio, se trata m\u00e1s de lo que la gente considera fundamental para la programaci\u00f3n orientada a objetos: \u00bfhay tres o cuatro conceptos principales?<\/p>\n<p>Puede suponer del art\u00edculo anterior (y mucho menos el t\u00edtulo), creo que hay cuatro.<\/p>\n<p>Y en esta publicaci\u00f3n, voy a cubrir los dos \u00faltimos:<\/p>\n<ul>\n<li>Herencia,<\/li>\n<li>y polimorfismo<\/li>\n<\/ul>\n<p>Si ha realizado alg\u00fan tipo de programaci\u00f3n orientada a objetos antes de leer este art\u00edculo, es probable que haya o\u00eddo hablar de al menos uno de estos.<\/p>\n<p>De todos modos, echemos un vistazo a cada uno de ellos con m\u00e1s detalle.<\/p>\n<h2>Dos pilares m\u00e1s de OOP<\/h2>\n<p>Antes de saltar a cada uno de estos, quiero asegurarme de que est\u00e1 al tanto de lo que hemos cubierto hasta ahora.<\/p>\n<h3>Una palabra sobre el an\u00e1lisis<\/h3>\n<p>No extender\u00e9 el punto, pero la raz\u00f3n por la que ahora estoy hablando de los fundamentos de la orientaci\u00f3n a objetos es porque estamos pasando a una fase diferente de este material. Comenzamos cubriendo la fase de <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">an\u00e1lisis que inclu\u00eda:<\/a><\/strong><\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/programacion-orientada-a-objetos-en-wordpress-analisis-parte-1\/\" title=\"An\u00e1lisis, Parte 1\">An\u00e1lisis, Parte 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/programacion-orientada-a-objetos-en-wordpress-analisis-parte-2\/\" title=\"An\u00e1lisis, Parte 2\">An\u00e1lisis, Parte 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/programacion-orientada-a-objetos-en-wordpress-comprension-de-las-expectativas-del-cliente\/\" title=\"Comprender las expectativas del cliente\">Comprender las expectativas del cliente<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/programacion-orientada-a-objetos-en-wordpress-declaracion-de-trabajo\/\" title=\"Declaraci\u00f3n de trabajo\">Declaraci\u00f3n de trabajo<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/programacion-orientada-a-objetos-en-wordpress-terminos-y-condiciones\/\" title=\"T\u00e9rminos y condiciones\">T\u00e9rminos y condiciones<\/a><\/li>\n<\/ol>\n<h3>Ahora al desarrollo<\/h3>\n<p>Y ahora estamos en la fase de <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desarrollo .<\/a><\/strong> Algunos pueden llamarlo fundamentos (pero estoy contento de que no se puede hacer un buen desarrollo sin los fundamentos, as\u00ed que eso es (.<\/p>\n<p>Si no ha le\u00eddo <strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/los-dos-primeros-pilares-de-la-programacion-orientada-a-objetos\/\" title=\"la publicaci\u00f3n anterior\">la publicaci\u00f3n anterior<\/a><\/strong>, le recomiendo que lo haga antes de continuar, ya que cubre los conceptos de Abstracci\u00f3n, Encapsulaci\u00f3n y c\u00f3mo se relaciona con WordPress.<\/p>\n<h3>3 Herencia<\/h3>\n<p>El concepto de herencia es bastante f\u00e1cil de seguir. Es decir, una clase puede heredar atributos de otra clase. Dar\u00e9 algunos ejemplos de esto en un momento, pero perm\u00edtanme proporcionar una definici\u00f3n de trabajo para los fines de esta publicaci\u00f3n:<\/p>\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<h4>Ejemplo 1: un documento<\/h4>\n<p>En t\u00e9rminos muy simples, digamos que tiene una clase llamada Documento y un documento tiene un t\u00edtulo y tiene contenido. Luego hay una subclase de documento que tiene atributos para una fecha y hora. Podr\u00edamos llamar a esto PostDocument o PageDocument.<\/p>\n<p>Es decir, PageDocument <strong>hereda<\/strong> las propiedades y atributos de Document al mismo tiempo que le agrega su propia implementaci\u00f3n. \u00bfTener sentido?<\/p>\n<p>Si no, no te preocupes. No siempre hace &quot;clic&quot; al principio, as\u00ed que veamos otro ejemplo.<\/p>\n<h4>Ejemplo 2: un mensaje<\/h4>\n<p>Digamos que tenemos una clase Message. Un mensaje normalmente tiene dos propiedades:<\/p>\n<ul>\n<li>1 un remitente,<\/li>\n<li>2 Un destinatario.<\/li>\n<\/ul>\n<p>Sin embargo, es justo decir que hay diferentes tipos de mensajes, \u00bfverdad? Es decir, quiz\u00e1s tengamos un EmailMessage o quiz\u00e1s tengamos un TextMessage.<\/p>\n<p>Un EmailMessage todav\u00eda tiene un remitente y un destinatario, pero tiene mucho m\u00e1s, \u00bfverdad? Tiene cosas como:<\/p>\n<ul>\n<li>una l\u00ednea de asunto,<\/li>\n<li>un archivo adjunto opcional,<\/li>\n<li>otro conjunto de remitentes a los que se env\u00eda,<\/li>\n<li>soporte para copiar a otros en el mensaje de forma p\u00fablica o privada,<\/li>\n<li>y mucho m\u00e1s.<\/li>\n<\/ul>\n<p>Un mensaje de texto, por otro lado, no necesariamente tendr\u00e1 todo lo anterior. Supongamos que estamos hablando de un mensaje SMS b\u00e1sico (en lugar de un mensaje de texto enriquecido en algo como Hangouts, Telegram, iMessage o cualquier otra cosa que est\u00e9 disponible).<\/p>\n<p>Esta clase:<\/p>\n<ul>\n<li>estar vinculado a un n\u00famero de tel\u00e9fono,<\/li>\n<li>puede incluir un grupo de otros destinatarios, todos los cuales son p\u00fablicos,<\/li>\n<li>un operador (que es un proveedor de telefon\u00eda celular),<\/li>\n<li>un n\u00famero m\u00e1ximo de caracteres que puede contener<\/li>\n<li>la capacidad de dividir un solo mensaje en varios mensajes si la cantidad m\u00e1xima de caracteres excede una cierta cantidad de caracteres.<\/li>\n<\/ul>\n<p>Pero a\u00fan plantea preguntas sobre las propiedades y los m\u00e9todos (o, en t\u00e9rminos m\u00e1s generales, la implementaci\u00f3n, \u00bfno?)<\/p>\n<h4>Una palabra sobre la implementaci\u00f3n<\/h4>\n<p>Cuando se trata de programaci\u00f3n orientada a objetos, tenemos lo que llamamos modificadores de acceso. Tal vez los haya le\u00eddo en otros lugares denominados, por ejemplo, modificadores de visibilidad o algo as\u00ed.<\/p>\n<p>Todo es lo mismo.<\/p>\n<p>En resumen, estos modificadores se pueden definir como:<\/p>\n<blockquote>\n<p>Palabras clave que controlan qu\u00e9 otras clases tienen acceso a la informaci\u00f3n disponible.<\/p>\n<\/blockquote>\n<p>Afortunadamente, esta parte es f\u00e1cil de entender:<\/p>\n<ul>\n<li><strong>Las propiedades y funciones privadas<\/strong> solo son accesibles para la clase en la que est\u00e1n definidas. Esto significa que PostDocument no puede usar nada en Documento que est\u00e9 marcado como privado. Para todos los efectos, PostDocument ni siquiera sabe que existe esta informaci\u00f3n.<\/li>\n<li><strong>Las propiedades y funciones protegidas<\/strong> son accesibles para la clase en la que est\u00e1n definidas y cualquier clase que sea descendiente. Es decir, cualquier clase que herede datos de la clase base o de la clase padre tiene acceso a ellos. Entonces, a diferencia de los detalles de implementaci\u00f3n <strong>privados<\/strong>, PostDocument puede acceder a la informaci\u00f3n de Document si est\u00e1 marcado como protegido.<\/li>\n<li><strong>las<\/strong> propiedades y funciones p\u00fablicas son accesibles a cualquiera. Esto no tiene nada que ver con la herencia, en realidad, sino m\u00e1s bien con la encapsulaci\u00f3n, en todo caso. En cambio, se trata de decidir a qu\u00e9 queremos que accedan otros objetos.<\/li>\n<\/ul>\n<p>Entonces, \u00bfc\u00f3mo se maneja la implementaci\u00f3n? Esto var\u00eda de un idioma a otro, pero PHP no es compatible con lo que se llama &quot;herencia m\u00faltiple&quot;. En pocas palabras, una clase dada en <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP solo puede heredar (o extender) otra clase<\/a>. No varias clases (algunos idiomas admiten esto).<\/p>\n<blockquote>\n<p>Cuando extiende una clase, la subclase hereda todos los m\u00e9todos p\u00fablicos y protegidos de la clase principal. A menos que una clase anule esos m\u00e9todos, conservar\u00e1n su funcionalidad original.<\/p>\n<\/blockquote>\n<p>En nuestro ejemplo, no podemos introducir otra clase como WriteDocument que hereda tanto de PageDocument como de PostDocument. Es uno o el otro. Y vale la pena se\u00f1alar que si hereda de PostDocument, tambi\u00e9n hereda informaci\u00f3n de Document porque es una subclase de una subclase de una clase.<\/p>\n<h3>4 polimorfismo<\/h3>\n<p>Ahora que tenemos una definici\u00f3n b\u00e1sica de herencia, podemos hablar de polimorfismo. La buena noticia es que es una palabra grande y extra\u00f1a para un concepto muy simple.<\/p>\n<p>La mala noticia es que no hemos hablado de interfaces o clases abstractas. Estos est\u00e1n llegando, pero se consideran parte de los cuatro pilares, as\u00ed que no te preocupes por ellos en este momento.<\/p>\n<p>En cambio, pi\u00e9nsalo de la siguiente manera:<\/p>\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>Todav\u00eda puede ser confuso, pero \u00bfrecuerda nuestro ejemplo de mensaje anterior? Podemos instanciar una clase SMSMessage que <strong>ampl\u00ede<\/strong> la clase Message y luego llamar a ciertos m\u00e9todos en ella.<\/p>\n<p>El SMSMessage puede tener un m\u00e9todo que tiene la clase Message. Y si se ha creado una instancia de la clase como una instancia de la clase SMSMessage, entonces llamar\u00e1 a ese m\u00e9todo. De manera similar, si no tiene un m\u00e9todo pero su clase principal, Mensaje, s\u00ed lo tiene, entonces llamar\u00e1 a ese m\u00e9todo.<\/p>\n<p>A veces, es m\u00e1s f\u00e1cil entender esto en c\u00f3digo, as\u00ed que hag\u00e1moslo.<\/p>\n<p>Primero, definamos nuestra clase <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-00-message-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Message<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nclass Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the Message class.n\";\n  }\n\n  public function receive()\n  {\n    echo \"This message was received from the Message class.n\";\n  }\n}\n<\/code><\/pre>\n<p>Luego definamos nuestra clase <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-01-smsmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SMSMessage<\/a>. Tenga en cuenta que no tiene una funci\u00f3n de <strong>recepci\u00f3n()<\/strong>. Esto ser\u00e1 importante moment\u00e1neamente:<\/p>\n<pre><code>&lt;?php\nclass SMSMessage extends Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the SMSMessage class.n\";\n  }\n}<\/code><\/pre>\n<p>Ahora, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-02-functionaldemo1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">instanciamos nuestra<\/a><\/strong> clase Message y llamamos a algunos m\u00e9todos:<\/p>\n<pre><code>&lt;?php\n$message = new Message();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Y hagamos lo mismo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-03-functionaldemo2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">usando la clase SMSMessage:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n$message = new SMSMessage();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Si desea el script completo, puede verlo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqu\u00ed<\/a><\/strong>, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">descargarlo<\/a> y ejecutarlo localmente.<\/p>\n<h2>Herencia, polimorfismo y WordPress<\/h2>\n<p>Esta es la conclusi\u00f3n (y exploraremos esto m\u00e1s cuando nos adentremos en las interfaces y las clases abstractas): cuando una clase <strong>extiende<\/strong> otra clase y no tiene los detalles de implementaci\u00f3n que tiene su clase principal, se usar\u00e1 la implementaci\u00f3n principal.<\/p>\n<p>Otra forma de pensarlo es \u00abtrabajar en la cadena de mando&quot;. Comenzar\u00e1 con la clase m\u00e1s baja a lo que hemos creado. En nuestro ejemplo anterior, ese es el SMSMessage. Si no lo encuentra all\u00ed, subir\u00e1 a la clase que extiende. (Y si no lo encuentra all\u00ed y esa clase extiende una clase, lo intentar\u00e1 all\u00ed).<\/p>\n<p>Todo el asunto polim\u00f3rfico es esto: instanciamos una clase de un tipo, SMSMessage, pero est\u00e1 usando la implementaci\u00f3n de una clase de otro tipo (que hereda, s\u00ed, pero eso es diferente de todos modos).<\/p>\n<h3>Clases de escritura en WordPress<\/h3>\n<p>Finalmente, me gustar\u00eda dejarlos con esto: he mencionado algo similar a esto en la publicaci\u00f3n anterior, pero quiero reiterarlo aqu\u00ed.<\/p>\n<p>Independientemente de cu\u00e1ntos de estos conceptos utilice el n\u00facleo de WordPress, no importa porque podemos escribir c\u00f3digo orientado a objetos de alta calidad en WordPress que interact\u00faa con WordPress y funciona bien con WordPress (y otro c\u00f3digo de terceros, no siempre, pero muchas veces).<\/p>\n<h2>\u00bfQu\u00e9 sigue ahora?<\/h2>\n<p>A continuaci\u00f3n, veremos las interfaces y las abstracciones.<\/p>\n<p>Estos siguen siendo fundamentales para la programaci\u00f3n orientada a objetos, pero si ha entendido las dos publicaciones anteriores, est\u00e1 preparado para una experiencia s\u00f3lida con los pr\u00f3ximos conceptos.<\/p>\n<p>Y si no, \u00a1no te preocupes! Siempre puedes hablar de ello en los comentarios o podemos charlar m\u00e1s sobre ello por correo electr\u00f3nico.<\/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>Aqu\u00ed, termino mis dos publicaciones sobre los cuatro pilares de la programaci\u00f3n orientada a objetos que cubren la herencia y el polimorfismo junto con una demostraci\u00f3n funcional.<\/p>\n","protected":false},"author":1,"featured_media":164983,"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-229826","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\/229826","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=229826"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229826\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/164983"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}