Qué es la Programación Orientada a Objetos, un paradigma de programación que permite desarrollar aplicaciones complejas manteniendo un código más claro y manejable que otros paradigmas anteriores.
En este artículo vamos a explicar qué es la Programación Orientada a Objetos, explicando además algunos de los conceptos más importantes que debemos de conocer cuando queremos programar orientado a objetos.
Para poder entender este concepto, que a algunos se nos atraganta en el aprendizaje de la programación, debemos muchas veces desaprender conceptos conocidos anteriormente, quizás mal explicados y liberar la mente para volver a aprender de la mejor manera. Por ello vamos a ir poco a poco.
Qué es la programación Orientada a Objetos
Empecemos con una definición formal, aunque no te preocupes si no lo entiendes todo, porque luego vamos a ir detallando más cada punto.
La programación Orientada a objetos se define como un paradigma de la programación, una manera de programar específica, donde se organiza el código en unidades denominadas clases, de las cuales se crean objetos que se relacionan entre sí para conseguir los objetivos de las aplicaciones.Podemos entender la programación Orientada a objetos (POO) como una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real que otros tipos de programación, que permite diseñar mejor las aplicaciones, llegando a mayores cotas de complejidad, sin que el código se vuelva inmanejable.
Al programar orientado a objetos tenemos que aprender a pensar cómo resolver los problemas de una manera distinta a como se realizaba anteriormente, en la programación estructurada. Ahora tendremos que escribir nuestros programas en términos de clases, objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base que permita soltarnos un poco con los conceptos de este tipo de programación.
Motivación de la programación orientada a objetos
Durante años, los programadores se han dedicado a construir aplicaciones muy parecidas que resolvían una y otra vez los mismos problemas. Para conseguir que los esfuerzos de los programadores puedan ser reutilizados se creó la posibilidad de utilizar módulos. El primer módulo existente fue la función, que somos capaces de escribir una vez e invocar cualquier número de veces.
Sin embargo, la función se centra mucho en aportar una funcionalidad dada, pero no tiene tanto interés con los datos. Es cierto que la función puede recibir datos como parámetros y puede devolverlos, pero los trata de una estructura muy volatil, centrada en las operaciones. Simplemente hace su trabajo, procesando los parámetros recibidos y devuelve una respuesta.
En las aplicaciones en realidad los datos están muy ligados a la funcionalidad. Por ejemplo podemos imaginar un punto que se mueve por la pantalla. El punto tiene unas coordenadas y podemos trasladarlo de una posición a otra, sumando o restando valores a sus coordenadas. Antes de la programación orientada a objetos ocurría que cada coordenada del punto tenía que guardarse en una variable diferente (dos variables para ser exacto: x, y) y las funciones de traslación estaban almacenadas por otra parte. Esta situación no facilitaba la organización del código ni tampoco su reutilización.
Con la Programación Orientada a Objetos se buscaba resolver estas situaciones, creando unas mejores condiciones para poder desarrollar aplicaciones cada vez más complejas, sin que el código se volviera un caos. Además, se pretendía dar una de pautas para realizar las cosas de manera que otras personas puedan utilizarlas y adelantar su trabajo, lo que deriva en mayores facilidades para la reutilización del código.
La POO no es difícil, pero es una manera especial de pensar, a veces subjetiva de quien la programa, de manera que la forma de hacer las cosas puede ser diferente según el programador. Aunque podamos hacer los programas de formas distintas, no todas ellas son correctas, lo difícil no es programar orientado a objetos sino programar bien. Y programar bien es fundamental porque así podemos aprovechar de todas las ventajas de la POO.
Cómo se piensa en objetos
Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real. Por ejemplo vamos a pensar en un coche para tratar de modelizarlo en un esquema de POO.
Diríamos que el coche es el elemento principal que tiene una serie de características, como podrían ser el color, el modelo o la marca. Además tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar.
Por tanto, pensar en objetos requiere analizar qué elementos vas a manejar en tus programas, tratando de identificar sus características y funcionalidades. Una vez tengamos un ecosistema de objetos, éstos colaborarán entre sí para resolver los objetivos de las aplicaciones.
Manejando el concepto de clase
En un esquema de programación orientada a objetos "el coche" sería lo que se conoce como "Clase". La clase contiene la definición de las características de un modelo (el coche), como el color o la marca, junto con la implantación de sus funcionalidades, como arrancar o parar.
Las características definidas en la clase las llamamos propiedades y las funcionalidades asociadas las llamamos métodos.
Para entender este concepto tan importante dentro de la Programación Orientada a Objetos, podemos pensar que la clase es como un libro, que describe como son todos los objetos de un mismo tipo. La clase coche describe cómo son todos los coches del mundo, es decir, qué propiedades tienen y qué funcionalidades deben poder realizar y, por supuesto, cómo se realizan.
Manejando el concepto de objetos
A partir de una clase podemos crear cualquier número de objetos de esa clase. Por ejemplo, a partir de la clase "el coche" podemos crear un coche rojo que es de la marca Ford y modelo Fiesta, otro verde que es de la marca Seat y modelo Ibiza.
Por tanto, los objetos son ejemplares de una clase, o elementos concretos creados a partir de una clase. Puedes entender a la clase como el molde y a los objetos como concreciones creadas a partir del molde de clase.
Otros ejemplos concretos de clases y objetos
Por poner otro ejemplo vamos a ver cómo modelizaríamos en un esquema POO una fracción, es decir, esa estructura matemática que tiene un numerador y un denominador que divide al numerador, por ejemplo 3/2.
La fracción será la clase y tendrá dos propiedades, el numerador y el denominador. Luego podría tener varios métodos como simplificarse, sumarse con otra fracción o número, restarse con otra fracción, etc.
A partir de la definición de una fracción (la clase) podremos construir un número indeterminado de objetos de tipo fracción. Por ejemplo podemos tener el objeto fracción 2/5 o 3/9, 4/3, etc. Todos esos son objetos de la clase fracción de números enteros.
Nuestra clase fracción la podríamos utilizar en cualquier número de programas, por ejemplo en un programa de matemáticas hará uso de la clase fracción y construirá muchos objetos de tipo fracción para hacer cuentas diversas. Pero podrías usar esa misma clase fracción en un programa de contabilidad o facturación.
Otro ejemplo podría ser la clase coordenada, que tiene dos propiedades, el valor x e y. Podrías tener otra clase "coordenada 3D" que necesitaría 3 propiedades x, y y z. Las coordenadas se podrían sumar a otra coordenada, mostrarse en un gráfico, encontrar el camino más corto entre dos coordenadas, etc.
Estos son simplemente ejemplos simples de clases, que también nos sirven para destacar la reutilización que podemos conseguir con los objetos. La clase coordenada la podremos usar en infinidad de programas de gráficos, mapas, etc. Por su parte, la clase coche la podrás utilizar en un programa de gestión de un taller de coches o en un programa de gestión de un parking. A partir de clase coche y crearán diversos objetos de tipo coche para hacer las operativas tanto en la aplicación del taller como en la del parking.Los objetos colaboran entre sí
En los lenguajes puramente orientados a objetos, tendremos únicamente clases y objetos. Las clases permitirán definir un número indeterminado de objetos, que colaboran entre ellos para resolver los problemas.
Con muchos objetos de diferentes clases conseguiremos realizar las acciones que se desean implementar en la funcionalidad de la aplicación.
Además, las propias aplicaciones como un todo, también serán definidas por medio de clases. Es decir, el taller de coches será una clase, de la que podremos crear el objeto taller de coches, que utilizará objetos coche, objetos de clase herramienta, objetos de clase mecánico, objetos de clase recambio, etc.
Para continuar vamos a definir de manera más formal los conceptos que acabamos de introducir anteriormente.
Clases en Programación Orientada a Objetos
Como habrás podido entender, las clases son declaraciones de objetos, también se podrían definir como abstracciones de objetos. Esto quiere decir que la definición de un objeto es la clase. Cuando programamos un objeto y definimos sus características y funcionalidades en realidad lo que estamos haciendo es programar una clase. En los ejemplos anteriores en realidad hablábamos de las clases coche o fracción porque sólo estuvimos definiendo, aunque por encima, sus formas.
Propiedades en clases
Las propiedades o atributos son las características de los objetos o ejemplares de una clase. Cuando definimos una propiedad normalmente especificamos su nombre y su tipo.
Aunque no es una manera muy correcta de hablar, nos podemos hacer a la idea de que las propiedades son algo así como variables donde almacenaremos los datos relacionados con los objetos.
Métodos en las clases
Son las funcionalidades asociadas a los objetos, que son implantadas o programadas dentro de las clases. Es decir, cuando estamos programando las clases, las funciones que creamos dentro asociadas a esas clases las llamamos métodos.
Aunque los métodos son como funciones, es importante que los llames métodos para que quede claro que son funciones que existen dentro del contexto de una clase, funciones que podremos invocar sobre todos los objetos creados a partir de una clase.
Objetos en Programación Orientada a Objetos
Los objetos son ejemplares de una clase. A partir de una clase puedo crear ejemplares (objetos) de esa clase, que tendrán por tanto las características y funcionalidades definidas en esa clase.
Cuando creamos un ejemplar tenemos que especificar la clase a partir de la cual se creará. Esta acción de crear un objeto a partir de una clase se llama instanciar (que viene de una mala traducción de la palabra instace que en inglés significa ejemplar). Por ejemplo, un objeto de la clase fracción es por ejemplo 3/5. El concepto o definición de fracción sería la clase, pero cuando ya estamos hablando de una fracción en concreto 4/7, 8/1000, o cualquier otra, la llamamos objeto.
Para crear un objeto se tiene que escribir una instrucción especial que puede ser distinta dependiendo el lenguaje de programación que se emplee, pero será algo parecido a esto.
miCoche = new Coche()
Con la palabra "new" especificamos que se tiene que crear una instancia de la clase que sigue a continuación.
En este caso "Coche" sería el nombre de la clase. Con la palabra "new" se crea una nueva instancia de coche, un objeto concreto de la clase coche y ese objeto se almacena en la variable "miCoche".
Dentro de los paréntesis podríamos colocar parámetros con los que inicializar el objeto de la clase coche, como podría ser su color, o su marca.
Estados en objetos
Cuando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando tenemos un coche la propiedad color tomará un valor en concreto, como por ejemplo rojo o gris metalizado. El valor concreto de una propiedad de un objeto se llama estado.
Para acceder a un estado de un objeto para ver su valor o cambiarlo se utiliza el operador punto.
miCoche.color = "rojo"
El objeto es miCoche, luego colocamos el operador punto y por último el nombre de la propiedad a la que deseamos acceder. En este ejemplo estamos cambiando el estado de la propiedad "color" del objeto al valor "rojo". Esto lo hacemos con una simple asignación.
Mensajes en objetos
Un mensaje en un objeto es la acción de efectuar una llamada a un método. Por ejemplo, cuando le decimos a un objeto coche que se ponga en marcha estamos pasándole el mensaje "ponte en marcha".Para mandar mensajes a los objetos utilizamos el operador punto, seguido del método que deseamos invocar y los paréntesis, como en las llamadas a las funciones.
miCoche.ponteEnMarcha()
En este ejemplo pasamos el mensaje "ponteEnMarcha" al objeto "miCoche".
Después del nombre del método que queremos invocar hay que colocar paréntesis, igual que cuando invocamos una función. Dentro de los paréntesis irían los parámetros, si es que el método los requiere.
Más sobre la Programación Orientada a Objetos
Hay mucho todavía que conocer de la POO ya que sólo hemos hecho referencia a las cosas más básicas. Existen multitud de conceptos que debes todavía aprender para dominar este paradigna de la programación, como los miembros estáticos. Incluso mecanismos un poco más avanzados como la herencia y el polimorfismo que son unas de las posibilidades más potentes de este paradigma de la programación.
La herencia sirve para crear objetos que incorporen propiedades y métodos de otros objetos. Así podremos construir unos objetos a partir de otros sin tener que reescribirlo todo. Puedes encontrar en DesarrolloWeb.com un artículo completo dedicado a la Herencia.
El polimorfismo sirve para que no tengamos que preocuparnos sobre lo que estamos trabajando, y abstraernos para definir un código que sea compatible con objetos de varios tipos. Puedes acceder a otro artículo para saber más sobre Polimorfismo.
Son conceptos avanzados que cuesta explicar en pocas líneas, por lo que los vemos de manera separada. No hay que olvidar que existen libros enteros dedicados a la POO y aquí solo pretendemos dar un repaso a algunas cosas para que os suenen cuando tengáis que poneros delante de ellas en los lenguajes de programación. Sin embargo, si quieres saber más también puedes continuar leyendo en DesarrolloWeb.com, en el manual de la teoría de la Programación orientada a objetos.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...