La Programación Orientada a Objetos o POO es lo que se conoce como un paradigma de programación. Un paradigma de programación es un modelo que siguen determinados programadores en el momento de realizar su trabajo, una manera específica de programar.
Actualmente la programación orientada a objetos es el paradigma de programación más habitual. Esto se debe a la practicidad del paradigma. Como se comentará más adelante, se beneficia de una manera de pensar intuitiva, además de que evita la duplicidad de código y facilita su reutilización. Esto ha hecho que numerosos lenguajes como Java o Python utilicen la POO para definir la mayoría de sus programas.
La programación orientada a objetos se basa en un principio básico: hay que dejar de pensar en los programas que empleamos para programar y empezar a pensar en los objetos que programamos. Es por eso que busca entender el funcionamiento del objeto en cuestión determinando su clase, sus atributos y sus métodos.
Objetos, clases, atributos y métodos
El primer concepto que hay que definir para entender la programación orientada a objetos es el de clase.
Una clase es una manera genérica de definir cómo serán determinados objetos. Funcionan a modo de hiperónimo, es decir, un concepto que, en su significado, abarca el de muchos otros. Si quisiéramos crear una rosa (que sería el objeto), la clase en cuestión podría llamarse “flores” y tendría una serie de atributos relacionados.
El objeto es, por lo tanto, aquello que queremos programar. Aun así, dicho objeto no tiene ningún sentido sin una serie de atributos relacionados. Un ejemplo de atributo podría ser “altura”, que tendría una serie de valores asociados. Esta altura crece con el tiempo, lo que supondría programar algún mecanismo para que el tamaño de la rosa incremente con el paso de los años. A estos mecanismos asociados a los atributos se les conoce como métodos, y hacen referencia a aquello que puede hacer el objeto. El atributo hace referencia a lo que es o, mejor dicho, a lo que consideramos relevante dentro de todas las características que tiene.
En resumen: un objeto es lo que programamos, una clase engloba diferentes objetos similares, un atributo son las características del objeto y un método las acciones que podrá llevar a cabo.
Los atributos y métodos en las clases y objetos
En la programación orientada a objetos, cuando programamos un objeto estamos indirectamente programando una clase.
Las clases, al igual que los objetos, tienen características que las diferencian de otras clases. En la misma línea, los objetos de una misma clase tienen características que los diferencian de otros. Y cuando hablamos de características hablamos de atributos.
Al programar una clase es importante tener en cuenta que todos los atributos y métodos que se le asocien se aplicarán a todos sus objetos. Si una clase es “personas” deberemos indicar que todas ellas tienen dos ojos y una nariz del mismo modo que deberemos indicar que pueden respirar. Pese a esto, no podemos decir que todos los objetos de la clase “personas” tienen ojos marrones. Si hacemos esto, todos los objetos de esta clase tendrán ojos marrones. Es por eso que, antes de empezar a programar, hay que identificar qué atributos y métodos comparten todos los objetos de una clase y con cuales se diferencian.
Principios de la Programación Orientada a Objetos
Te definimos los cuatro principios básicos por los que funciona la POO.
-
Encapsulación
La encapsulación hace referencia a toda la información que se almacena dentro de un objeto determinado y la parte de dicha información que es visible para el exterior. En términos generales, los atributos de un objeto o una clase están ocultos, y solo son visibles sus métodos para el exterior.
Este principio busca mostrar únicamente la información relevante para los usuarios. Los atributos de un objeto pueden ser modificados por un administrador, pero un usuario sólo podrá visualizar las consecuencias de dichos atributos. De esta manera los usuarios sólo tienen acceso a las funcionalidades necesarias, algo que también evita ataques informáticos o usos inadecuados del programa.
Para dar un ejemplo, imaginemos que una mosca es un objeto. Queremos que el usuario vea cómo vuela y cómo come (los métodos), pero no es necesario que comprenda el funcionamiento de sus órganos, un funcionamiento que deberá programarse de todos modos. Ocultando este funcionamiento evitamos que el usuario visualice información innecesaria o que pueda copiar nuestra mosca.
-
Herencia
El concepto de herencia hace referencia a la relación entre clases. En la programación orientada a objetos existen clases primarias, secundarias y hasta el nivel que desee el desarrollador. La herencia hace referencia a la relación jerárquica entre estas clases y los atributos que comparten.
Las clases primarias transmiten ciertos atributos y métodos a las clases secundarias. Esto permite crear fácilmente nuevas clases relacionadas en base a la selección de los atributos que se desean transmitir. Luego, la nueva clase puede editarse de manera individual para añadir o quitar determinados elementos, convirtiéndola en una clase nueva pero subordinada de otra.
Para dar un ejemplo cogeremos la clase “mamíferos”. Esta clase se puede dividir en una gran cantidad de subclases, pero todas ellas tendrán un método en común: los mamíferos se desplazan. Pese a esto, una ballena no se desplaza igual que un humano o que un murciélago. Programar el método movimiento desde la clase “mamíferos” de manera exacta implicaría una gran cantidad de texto lleno de condiciones. En este punto tenemos el beneficio de la herencia. Esto nos permite indicar que todos los mamíferos se mueven para, después, alterar las características de este movimiento en clases secundarias, como “mamíferos acuáticos”.
-
Abstracción
La abstracción está muy relacionada con la encapsulación, y hace referencia a la interacción del usuario únicamente con los métodos y atributos seleccionados por el programador. En otras palabras, el usuario interactúa de manera sencilla con objetos muy complejos.
La base de la abstracción es el uso de elementos simples para representar elementos complejos, ocultando la gran mayoría de sus características a los usuarios para que el uso del programa sea lo más intuitivo posible.
Pese a esto, también es muy útil de cara al programador. Al fin y al cabo, la abstracción significa simplificar el código, traducir elementos muy complejos con un código muy extenso en elementos simples que lo representan. Es por eso que la abstracción facilita el mantenimiento del código, algo muy útil en un paradigma de programación donde los programas tienden a ser muy extensos.
De nuevo con el ejemplo de la mosca, esta no necesita comprender el funcionamiento de sus alas para poder usarlas, sólo lleva a cabo un movimiento y el complejo mecanismo funciona por su cuenta.
-
Polimorfismo
Este concepto hace referencia a cómo diseñar el mismo objeto de diferentes maneras o lo que es lo mismo, diseñar objetos que repliquen el comportamiento de otros objetos pero de manera distinta. En términos de programación esto se traduce en la capacidad de utilizar la misma interfaz para representar diferentes formas o tipos de datos.
Este concepto va muy de la mano de la herencia. Los objetos de una clase pueden anular los comportamientos compartidos con su clase con comportamientos específicos del objeto. El polimorfismo permite que un mismo método ejecute comportamientos diferenciados en base a dos mecanismos conocidos como anulación de método y sobrecarga de método. De esta manera podemos diseñar un método que sea compatible con objetos de diferentes clases.
Ventajas de la programación orientada a objetos
La principal ventaja que presenta la programación orientada a objetos en relación a otros paradigmas de programación es que permite convertir estructuras muy complejas en estructuras simples y replicables. Esto permite la segunda ventaja del paradigma, la reutilización de código. Estas estructuras pueden replicarse y alterarse fácilmente grácias a las clases, que permiten modificar y copiar elementos en bloque.
Pese a esto, las clases también proporcionan una segunda ventaja, y es que evitan la duplicidad de código. En este sentido, permiten agrupar numerosas funcionalidades dentro de un único elemento, lo que simplifica enormemente la estructura del código. Esto también permite corregir errores en numerosos elementos de manera simultánea.
Por otro lado, la encapsulación y la abstracción facilitan, en primer lugar, el hecho de trabajar en equipo. La encapsulación permite “ocultar” el código de un objeto, lo que evita la duplicación de funciones cuando dos personas trabajan el mismo elemento de manera simultánea. Además, también permite proteger información ante usuarios externos, puesto que los usuarios sólo tienen acceso a los elementos y funciones que el programador desee.
Por último, los sistemas generados en base a la programación orientada a objetos son especialmente extensos y complejos. La abstracción permite simplificarlos y organizarlos de manera intuitiva y clara, lo que agiliza el proceso de programación.