Creando tu primera clase en programación orientada a objetos.
By: Date: enero 6, 2016 Categories: Programación

La mayoría de los lenguajes actuales se tienen 2 formas de programar aplicaciones y programas.

En modo de programación estructurada con funciones y en modo de programación orientada a objetos, algunos incluso permiten la convivencia de ambos estilos dentro de un mismo programa, como C++  y PHP. Otros como Java o C# solo admiten programación orientada a objetos.

La diferencia es que cuando se programa usando funciones estas pueden estar desorganizadas, salvo el programador sea muy disciplinado el código resultante puede ser horrible para leer y mantener, la mayoría de los nuevos programadores usan este tipo de programación en el mejor de los casos. El problema es que las funciones no comparten información entre ellas, son autónomas 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ón atreves de las funciones para que trabajen “ juntas “

En programación orientada a objetos una clase es un pequeño programa, con sus propias funciones y variables globales, pero con herramientas proveídas por el mismo estilo de programación que facilita mucho reutilizar la clase, como un pequeño programa una clase debe hacer una pequeña tarea, pero debe hacerla muy bien, las clases son llamadas desde otras clases para resolver un problema  o adjuntadas a otras clases que están resolviendo un problema pero necesita resolver un sub problema que ya lo resuelve otra clase existente, incluso pueden funcionarse ya que la solución de un problema puede ser lo que 2 o más clases solucionan de forma separada, a esto se le llama herencia.  Pero no quiero salirme de lo que es la clase en sí misma. Como datos adicionales los lenguajes 100% objetos como C# o Java, en ellos no existe una función main por que no son lenguajes con funciones, sino con métodos, por lo que la programación en estos lenguajes inicia con una clase vacía que tiene un método 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ás adelante en este artículo entenderás que es un método y una instancia de la clase.

La mayoría de las personas que enseñan programación 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ón funcional a objetos es por medio de algo que ya conoce, como ver un programa que soluciona cosas en funciones y luego  una clase  y es solo así a mi parecer la única 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ón funcional entonces estas volando muy cerca del sol, aprende programación funcional y luego aventúrate al mundo de la programación orientada a objetos, este consejo te doy por que yo soy Last Dragon y tu no.

Problema.

Se requiere un programa que cree un archivo y escriba unas líneas de texto usando PHP

Versión funcional

En esta versión funcional no habrá que crear ninguna nueva función, PHP ya tiene funciones para resolver este problema

<?php

$link = fopen (“archivo.txt”,”w+”);
fwrite ($link,”Texto en la línea”);
fclose ($link);

?>

Lo primero que vemos es que se resuelve con 3 líneas efectivas de código, esto es cierto y es muy bueno en programas pequeños, pero cuando el programa crece esto se puede complicar más.

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 “ TEXTO EN LA LINEA “ , también usamos link para cerrar el archivo. En un programa más grande con muchos archivos abiertos en algún 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ón al archivo, solo por citar algunos de los posibles errores.

En su versión de clase serán muchas más líneas de código, pero la lectura de programación y mantenimiento mejora mucho y se evitan problemas en programas más grandes.

Una clase se construye con otras clases o con funciones propias o del sistema, a las funciones se les llama métodos y a las variables globales dentro de la clase se le llaman propiedades. Los métodos y las funciones tienen 3 permisos básicos de declaración protected, private y public. Los 2 más comunes son private y public

Public es por default cuando declaramos algo en una clase siempre es public a menos que especifiquemos que es protected o private. ¿Cuando 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étodo, se usa private cuando el creador de la clase es el único que quiere trabajar con otros métodos 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étodo

¿ Que sentido tiene programar un método que otro programador no podrá llamar ?

Recordando el problema de la variable link donde en cualquier otra parte del programa podría ser sobre escrita y dañar la conexión al archivo, en una clase esa variable ( propiedad ) debería ser protegida para que ni por accidente pueda ser cambiada salvo sea así como deba ser pero solo dentro de la clase

Lo mismo ocurre con los métodos, a veces una clase tiene que partir un problema en métodos más pequeños, estos métodos pequeños no son la solución, son una pequeña parte de ella y no tienen sentido ser llamados por el programador, estos métodos privados son llamados por un método público para ayudar al método público a resolver el problema

Ahora la versión del mismo programa en PHP pero orientado a objetos.


<?php

class Archivos
{
private $link = “”;

function __CONSTRUCT ($file = “”)
{
// Asigando el archivo desde el constructor, pero para mayor simpleza del código no ejecutare nada en el constructor
// $this->link = $file;
}

function AbrirArchivo($file)
{
$this->link = fopen ($file,”w+”);
}

function EscribirLinea($line)
{
fwrite ($this->link,$line);
}

function CerrarArchivo()
{
fclose ($this->link);
}
}

$MiArchivo = new Archivos();
$MiArchivo->AbrirArchivo(“archivo.txt”);
$MiArchivo->EscribirLinea(“Texto en la línea “);
$MiArchivo->CerrarArchivo();

?>

Son muchas líneas de código 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ía de los lenguajes, por lo que MiArchivo es un objeto instancia de la clase Archivos

Una vez como objeto MiArchivo tiene todos los métodos de la clase a los cuales se accede con -> en PHP en otros lenguajes puede ser con ” : “ o “ . “ o como la sintaxis de este lenguaje indique, pero al final del día solo se trata de sintaxis la forma sigue siendo igual

Ventaja …

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ía hacer algo como $MiArchivo->link = “otro valor”; porque es privado y su asignación 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íneas que quiero que escriba en ese archivo y al final simplemente cierro el archivo, al cerrar el archivo en el método CerrarArchivo ni siquiera le paso parámetros, porque es MiArchivo como objeto y como un todo es quien ya tiene guardado en su interior el valor de link

Puedo hacer tantos objetos de una clase como quiera pudiera necesitar

$MiArchivo1 = new Archivos();
$MiArchivo2 = new Archivos();
$MiArchivo3 = new Archivos();

Y todos ellos serían archivos diferentes con su propio link privado, yo solo le pasaría el nombre del archivo a cada objeto y lo que quiero que escriban y aquí ya empieza a verse más beneficios, ya no tuve que escribir más código para MiArchivo2, es la misma clase, pero en otro objeto si tengo que manejar 50 archivos, creo 50 objetos de la misma clase.

Con una clase de base de datos podría hacer algo similar, hacer 50 conexiones a 50 bases de datos diferentes y no tendría que preocuparme por la conexión a cada una, por que internamente están manejando esos problemas, yo con el objeto solo me enfoco en la solución.

Cuando un programa es pequeño como este se puede sentir innecesario hacer una clase para resolver algo tan simple como escribir un archivo de texto pequeño, pero conforme el proyecto va creciendo de tamaño empiezas a ver con ojos de alegría estar usando programación orientada objetos, el proyecto ya puede crecer tanto como quieras y será fácil de mantener

La programación orientada a objetos no es mágica, tampoco se espera que un programador tonto no cometa errores, por ejemplo, podría llegar alguien y trolear la clase volviendo a llamar el método AbrirArchivo y asignar otro nombre de archivo, eso igual rompería el link, aunque link es privado para el objeto no es privado para ser llamado dentro del método publico AbrirArchivo. Si el programador que hace la clase piensa en estos escenarios podría solucionarlo haciendo comprobaciones, unos simple if aquí y ahí, 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íneas de programación por ejemplo asignar el nombre de archivo desde el momento de la creación del objeto, por ejemplo

$MiArchivo = new Archivos(“archivo.txt”);

Ya no tendría sentido llamar al método ArbrirArchivo por que el valor ya fue asignado desde la creación del objeto, como escribí anteriormente para no complicar el código con comprobaciones, este constructor no hace nada

Si eres nuevo en la programación orientada a objetos espero que a partir de aquí entiendas que es una clase y como puedes beneficiarte de la programación orientada a objetos en cualquier lenguaje que lo soporte que prácticamente son casi todos

Video del codigo ejecutado

One thought on “Creando tu primera clase en programación orientada a objetos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *