{"id":1621,"date":"2016-01-06T19:14:36","date_gmt":"2016-01-07T01:14:36","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=1621"},"modified":"2016-01-06T19:14:36","modified_gmt":"2016-01-07T01:14:36","slug":"creando-tu-primera-clase-en-programacion-orientada-a-objetos","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=1621","title":{"rendered":"Creando tu primera clase en programaci\u00f3n orientada a objetos."},"content":{"rendered":"<p>La mayor\u00eda de los lenguajes actuales se tienen 2 formas de programar aplicaciones y programas.<\/p>\n<p>En modo de programaci\u00f3n estructurada con funciones y en modo de programaci\u00f3n orientada a objetos, algunos incluso permiten la convivencia de ambos estilos dentro de un mismo programa, como C++\u00a0 y PHP. Otros como Java o C# solo admiten programaci\u00f3n orientada a objetos.<\/p>\n<p>La diferencia es que cuando se programa usando funciones estas pueden estar desorganizadas, salvo el programador sea muy disciplinado el c\u00f3digo resultante puede ser horrible para leer y mantener, la mayor\u00eda de los nuevos programadores usan este tipo de programaci\u00f3n en el mejor de los casos. El problema es que las funciones no comparten informaci\u00f3n entre ellas, son aut\u00f3nomas en el mejor de los casos la salida de una funciona termina siendo la entrada de otra, en el peor se usan apuntadores o variables globales para pasar informaci\u00f3n atreves de las funciones para que trabajen \u201c juntas \u201c<\/p>\n<p>En programaci\u00f3n orientada a objetos una clase es un peque\u00f1o programa, con sus propias funciones y variables globales, pero con herramientas prove\u00eddas por el mismo estilo de programaci\u00f3n que facilita mucho reutilizar la clase, como un peque\u00f1o programa una clase debe hacer una peque\u00f1a tarea, pero debe hacerla muy bien, las clases son llamadas desde otras clases para resolver un problema\u00a0 o adjuntadas a otras clases que est\u00e1n resolviendo un problema pero necesita resolver un sub problema que ya lo resuelve otra clase existente, incluso pueden funcionarse ya que la soluci\u00f3n de un problema puede ser lo que 2 o m\u00e1s clases solucionan de forma separada, a esto se le llama herencia.\u00a0 Pero no quiero salirme de lo que es la clase en s\u00ed misma. Como datos adicionales los lenguajes 100% objetos como C# o Java, en ellos no existe una funci\u00f3n main por que no son lenguajes con funciones, sino con m\u00e9todos, por lo que la programaci\u00f3n en estos lenguajes inicia con una clase vac\u00eda que tiene un m\u00e9todo main y el programa.exe es una instancia de esa clase, el programa en si mismo compilado es un objeto desde la perpectiva del lenguaje, m\u00e1s adelante en este art\u00edculo entender\u00e1s que es un m\u00e9todo y una instancia de la clase.<\/p>\n<p>La mayor\u00eda de las personas que ense\u00f1an programaci\u00f3n orientada objetos a la hora de hablar de una clase siempre se van a objetos triviales como una persona o un perro o cualquier cosa que resulta absurdo para un programador que ya ha trabajado con lenguajes funcionales, por que la mejor forma de explicar a un programador que ya viene de programaci\u00f3n funcional a objetos es por medio de algo que ya conoce, como ver un programa que soluciona cosas en funciones y luego\u00a0 una clase\u00a0 y es solo as\u00ed a mi parecer la \u00fanica manera en que puede entender de forma completa de una sola vez que es una clase. Si no eres un programador que viene de programaci\u00f3n funcional entonces estas volando muy cerca del sol, aprende programaci\u00f3n funcional y luego avent\u00farate al mundo de la programaci\u00f3n orientada a objetos, este consejo te doy por que yo soy Last Dragon y tu no.<\/p>\n<p><strong>Problema.<\/strong><\/p>\n<p><em>Se requiere un programa que cree un archivo y escriba unas l\u00edneas de texto usando PHP<\/em><\/p>\n<p><strong>Versi\u00f3n funcional<\/strong><\/p>\n<p>En esta versi\u00f3n funcional no habr\u00e1 que crear ninguna nueva funci\u00f3n, PHP ya tiene funciones para resolver este problema<\/p>\n<p><code>&lt;?php<\/code><\/p>\n<p>$link = fopen (&#8220;archivo.txt&#8221;,&#8221;w+&#8221;);<br \/>\nfwrite ($link,&#8221;Texto en la l\u00ednea&#8221;);<br \/>\nfclose ($link);<\/p>\n<p>?&gt;<\/p>\n<p>Lo primero que vemos es que se resuelve con 3 l\u00edneas efectivas de c\u00f3digo, esto es cierto y es muy bueno en programas peque\u00f1os, pero cuando el programa crece esto se puede complicar m\u00e1s.<\/p>\n<p>Desde ya podemos ver que al abrir y crear el archivo se crea un puntero al archivo almacenado en la variable link, esta variable la usamos para indicarle fwrite en que archivo se quiere que escriba \u201c TEXTO EN LA LINEA \u201c , tambi\u00e9n usamos link para cerrar el archivo. En un programa m\u00e1s grande con muchos archivos abiertos en alg\u00fan momento pudiera darse el caso de que alguien sobrescribiera el puntero al archivo en link por otro archivo o peor por otro valor como un string de un URL, perdiendo la conexi\u00f3n al archivo, solo por citar algunos de los posibles errores.<\/p>\n<p>En su versi\u00f3n de clase ser\u00e1n muchas m\u00e1s l\u00edneas de c\u00f3digo, pero la lectura de programaci\u00f3n y mantenimiento mejora mucho y se evitan problemas en programas m\u00e1s grandes.<\/p>\n<p>Una clase se construye con otras clases o con funciones propias o del sistema, a las funciones se les llama m\u00e9todos y a las variables globales dentro de la clase se le llaman propiedades. Los m\u00e9todos y las funciones tienen 3 permisos b\u00e1sicos de declaraci\u00f3n protected, private y public. Los 2 m\u00e1s comunes son private y public<\/p>\n<p>Public es por default cuando declaramos algo en una clase siempre es public a menos que especifiquemos que es protected o private. \u00bfCuando usamos public? Cuando queremos que el programador que usa la clase en su propio programa modifique el valor de una propiedad o pueda llamar un m\u00e9todo, se usa private cuando el creador de la clase es el \u00fanico que quiere trabajar con otros m\u00e9todos dentro de la clase o propiedades y no quiere darle al usuario de su clase la capacidad de modificar un valor o llamar un m\u00e9todo<\/p>\n<p><strong>\u00bf Que sentido tiene programar un m\u00e9todo que otro programador no podr\u00e1 llamar ?<\/strong><\/p>\n<p>Recordando el problema de la variable link donde en cualquier otra parte del programa podr\u00eda ser sobre escrita y da\u00f1ar la conexi\u00f3n al archivo, en una clase esa variable ( propiedad ) deber\u00eda ser protegida para que ni por accidente pueda ser cambiada salvo sea as\u00ed como deba ser pero solo dentro de la clase<\/p>\n<p>Lo mismo ocurre con los m\u00e9todos, a veces una clase tiene que partir un problema en m\u00e9todos m\u00e1s peque\u00f1os, estos m\u00e9todos peque\u00f1os no son la soluci\u00f3n, son una peque\u00f1a parte de ella y no tienen sentido ser llamados por el programador, estos m\u00e9todos privados son llamados por un m\u00e9todo p\u00fablico para ayudar al m\u00e9todo p\u00fablico a resolver el problema<\/p>\n<p><strong>Ahora la versi\u00f3n del mismo programa en PHP pero orientado a objetos.<\/strong><\/p>\n<p><code><br \/>\n&lt;?php<\/code><\/p>\n<p>class Archivos<br \/>\n{<br \/>\nprivate $link = &#8220;&#8221;;<\/p>\n<p>function __CONSTRUCT ($file = &#8220;&#8221;)<br \/>\n{<br \/>\n\/\/ Asigando el archivo desde el constructor, pero para mayor simpleza del c\u00f3digo no ejecutare nada en el constructor<br \/>\n\/\/ $this-&gt;link = $file;<br \/>\n}<\/p>\n<p>function AbrirArchivo($file)<br \/>\n{<br \/>\n$this-&gt;link = fopen ($file,&#8221;w+&#8221;);<br \/>\n}<\/p>\n<p>function EscribirLinea($line)<br \/>\n{<br \/>\nfwrite ($this-&gt;link,$line);<br \/>\n}<\/p>\n<p>function CerrarArchivo()<br \/>\n{<br \/>\nfclose ($this-&gt;link);<br \/>\n}<br \/>\n}<\/p>\n<p>$MiArchivo = new Archivos();<br \/>\n$MiArchivo-&gt;AbrirArchivo(&#8220;archivo.txt&#8221;);<br \/>\n$MiArchivo-&gt;EscribirLinea(&#8220;Texto en la l\u00ednea &#8220;);<br \/>\n$MiArchivo-&gt;CerrarArchivo();<\/p>\n<p>?&gt;<\/p>\n<p>Son muchas l\u00edneas de c\u00f3digo para resolver el mismo problema, pero una vez escrita la clase esta puede ser llamada tantas veces como sea necesaria, a la instancia de una clase se le llama objeto, la instancia de la clase se hace con la palabra reservada new en la mayor\u00eda de los lenguajes, por lo que MiArchivo es un objeto instancia de la clase Archivos<\/p>\n<p>Una vez como objeto MiArchivo tiene todos los m\u00e9todos de la clase a los cuales se accede con -&gt; en PHP en otros lenguajes puede ser con \u201d : \u201c o \u201c . \u201c o como la sintaxis de este lenguaje indique, pero al final del d\u00eda solo se trata de sintaxis la forma sigue siendo igual<\/p>\n<p><strong>Ventaja \u2026<\/strong><\/p>\n<p>Una vez instanciada la clase en el objeto MiArchivo ya no tengo que preocuparme por link que es una propiedad privada significa que yo no podr\u00eda hacer algo como $MiArchivo-&gt;link = \u201cotro valor\u201d; porque es privado y su asignaci\u00f3n de valor solo puede hacerse dentro de la clase y no en el objeto, esto significa que yo solo le paso al objeto el nombre de un archivo y las l\u00edneas que quiero que escriba en ese archivo y al final simplemente cierro el archivo, al cerrar el archivo en el m\u00e9todo CerrarArchivo ni siquiera le paso par\u00e1metros, porque es MiArchivo como objeto y como un todo es quien ya tiene guardado en su interior el valor de link<\/p>\n<p>Puedo hacer tantos objetos de una clase como quiera pudiera necesitar<\/p>\n<p><code>$MiArchivo1 = new Archivos();<br \/>\n$MiArchivo2 = new Archivos();<br \/>\n$MiArchivo3 = new Archivos();<\/code><\/p>\n<p>Y todos ellos ser\u00edan archivos diferentes con su propio link privado, yo solo le pasar\u00eda el nombre del archivo a cada objeto y lo que quiero que escriban y aqu\u00ed ya empieza a verse m\u00e1s beneficios, ya no tuve que escribir m\u00e1s c\u00f3digo para MiArchivo2, es la misma clase, pero en otro objeto si tengo que manejar 50 archivos, creo 50 objetos de la misma clase.<\/p>\n<p>Con una clase de base de datos podr\u00eda hacer algo similar, hacer 50 conexiones a 50 bases de datos diferentes y no tendr\u00eda que preocuparme por la conexi\u00f3n a cada una, por que internamente est\u00e1n manejando esos problemas, yo con el objeto solo me enfoco en la soluci\u00f3n.<\/p>\n<p>Cuando un programa es peque\u00f1o como este se puede sentir innecesario hacer una clase para resolver algo tan simple como escribir un archivo de texto peque\u00f1o, pero conforme el proyecto va creciendo de tama\u00f1o empiezas a ver con ojos de alegr\u00eda estar usando programaci\u00f3n orientada objetos, el proyecto ya puede crecer tanto como quieras y ser\u00e1 f\u00e1cil de mantener<\/p>\n<p>La programaci\u00f3n orientada a objetos no es m\u00e1gica, tampoco se espera que un programador tonto no cometa errores, por ejemplo, podr\u00eda llegar alguien y trolear la clase volviendo a llamar el m\u00e9todo AbrirArchivo y asignar otro nombre de archivo, eso igual romper\u00eda el link, aunque link es privado para el objeto no es privado para ser llamado dentro del m\u00e9todo publico AbrirArchivo. Si el programador que hace la clase piensa en estos escenarios podr\u00eda solucionarlo haciendo comprobaciones, unos simple if aqu\u00ed y ah\u00ed, si la propiedad link ya tiene asignado un nombre, entonces antes de hacer el cambio debe cerrar el archivo abierto actualmente antes de abrir uno nuevo, o si el nombre fue asignado desde el constructor igual, cerrar el archivo actual y abrir otro, en este ejemplo el constructor no hace nada, algunas clases permiten inicializar cosas desde el constructor para ahorrar l\u00edneas de programaci\u00f3n por ejemplo asignar el nombre de archivo desde el momento de la creaci\u00f3n del objeto, por ejemplo<\/p>\n<p><code>$MiArchivo = new Archivos(\u201carchivo.txt\u201d);<\/code><\/p>\n<p>Ya no tendr\u00eda sentido llamar al m\u00e9todo ArbrirArchivo por que el valor ya fue asignado desde la creaci\u00f3n del objeto, como escrib\u00ed anteriormente para no complicar el c\u00f3digo con comprobaciones, este constructor no hace nada<\/p>\n<p>Si eres nuevo en la programaci\u00f3n orientada a objetos espero que a partir de aqu\u00ed entiendas que es una clase y como puedes beneficiarte de la programaci\u00f3n orientada a objetos en cualquier lenguaje que lo soporte que pr\u00e1cticamente son casi todos<\/p>\n<p><strong>Video del codigo ejecutado<\/strong><\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/5uQoqduak40\" width=\"420\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La mayor\u00eda de los lenguajes actuales se tienen 2 formas de programar aplicaciones y programas. En modo de programaci\u00f3n estructurada con funciones y en modo de programaci\u00f3n orientada a objetos, algunos incluso permiten la convivencia de ambos estilos dentro de un mismo programa, como C++\u00a0 y PHP. Otros como Java o C# solo admiten programaci\u00f3n&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1622,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1621","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1621"}],"version-history":[{"count":1,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1621\/revisions"}],"predecessor-version":[{"id":1623,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1621\/revisions\/1623"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/media\/1622"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}