2.1 Conceptos básicos de la POO
En la base del enfoque orientado a objetos de la programación está la paradigma de la POO. Es cuando todas las entidades del programa se consideran como objetos. Los objetos son datos + métodos/funciones que hacen algo con esos datos.
También se puede decir que un objeto tiene estado y comportamiento. El estado del objeto está proporcionado por sus datos, que se almacenan en sus variables internas. El comportamiento del objeto es la suma de todas las acciones que ejecutan sus métodos.
En un programa medio hay muchos miles de objetos, en uno grande hay millones. Para reducir un poco el caos, se decidió organizar los objetos en clases, y las clases en una cierta jerarquía.
¡Es interesante! La idea de jerarquía de clases fue tomada del mundo animal, donde hay humanos, que son primates, que son mamíferos, etc.
Cada objeto tiene una clase, con la que se crea. Por un lado, una clase es un tipo de plantilla para un objeto, por otro lado, es un objeto independiente con sus propias características (de las que hablaremos más adelante).
Para entender mejor la idea de las clases, revisa los siguientes definiciones:
Clase:
Una clase es una plantilla o esquema para crear objetos, que define atributos y métodos característicos de todos los objetos de este tipo. Las clases permiten organizar datos y funciones que trabajan con esos datos en un todo.
Objeto:
Un objeto es una instancia de una clase. Cada objeto tiene estado (definido por atributos) y comportamiento (definido por métodos).
Encapsulación:
La encapsulación consiste en ocultar la implementación interna de la clase y proporcionar una interfaz para interactuar con los objetos de esa clase. Esto ayuda a proteger los datos y gestionar el acceso a ellos.
Herencia:
La herencia permite a una clase (hija) heredar atributos y métodos de otra clase (padre). Esto facilita la reutilización del código y simplifica su mantenimiento.
Polimorfismo:
El polimorfismo permite utilizar una única interfaz para trabajar con objetos de diferentes clases. Esto se logra al sobrescribir métodos en clases hijas que heredan de las clases padre.
Abstracción:
La abstracción consiste en identificar características comunes de los objetos y crear clases que representen estas características comunes. Esto ayuda a simplificar sistemas complejos y mejorar su comprensión.
Si entendiste al menos la mitad, ¡genial! Luego analizaremos cada uno de estos puntos con más detalle.
2.2 Abstracción
Un buen ejemplo de abstracción en la vida real es la descripción de puestos en una empresa u organización. El título del puesto es una cosa, pero las responsabilidades de cada puesto específico son algo completamente diferente.
Imagina que estás diseñando la estructura de tu futura empresa. Puedes distribuir las responsabilidades del secretario entre varios otros puestos. Puedes dividir el puesto de director ejecutivo en varios puestos independientes: director financiero, director técnico, director de marketing, director de recursos humanos. O, por ejemplo, combinar los puestos de gerente de oficina y reclutador en uno solo.
Desde el punto de vista de la programación, la abstracción es, digamos, una correcta división del programa en objetos. Usualmente, cualquier programa grande se puede representar de muchas maneras como objetos interactuando. La abstracción permite seleccionar las características principales y omitir las secundarias.
La abstracción es como una estrategia en el ámbito militar. Mala estrategia, y ninguna táctica genial podrá arreglar la situación.
2.3 Encapsulación
El objetivo de la encapsulación es mejorar la calidad de la interacción de los elementos mediante la simplificación de su interacción.
Y la mejor manera de simplificar algo es esconder todo lo complejo de los ojos de los demás. Por ejemplo, si te ponen en la cabina de un Boeing, no entenderás de inmediato cómo manejarlo:
Por otro lado, para los pasajeros del avión todo parece más sencillo: compraron el boleto, se sentaron en el avión, despegaron y aterizaron. Puedes volar fácilmente de un continente a otro, teniendo solo las habilidades de "comprar un boleto" y "sentarte en el avión". Todas las complejidades, como la preparación del avión para el vuelo, el despegue, el aterrizaje y diversas situaciones de emergencia están ocultas para nosotros. Sin mencionar la navegación satelital, el piloto automático y los centros de control en los aeropuertos. Y esto nos hace la vida más fácil.
Desde el punto de vista de la programación, la encapsulación es "ocultación de la
implementación"
. Me gusta esa definición. Nuestra clase puede contener cientos de métodos y
implementar comportamientos muy complejos en diversas situaciones. Pero podemos
ocultar de los ojos ajenos todos sus métodos (agregar "__" al principio
y al final de sus nombres), y dejar solo un par o tres métodos para interactuar
con otras clases.
Entonces, todas las demás clases de nuestro programa verán en esta clase
solo tres métodos y llamarán a estos
. Y todas las complejidades estarán escondidas
dentro de la clase, como la cabina de los pilotos de los felices pasajeros.
2.4 Herencia
La herencia tiene dos aspectos. El lado de la programación y el
lado de la vida real. Desde el punto de vista de la programación, la herencia es
una relación especial entre dos clases
.
Pero es mucho más interesante ver qué es la herencia desde el punto de vista
de la vida real.
Si tuviéramos que crear algo en la vida real, tenemos dos maneras:
- crear lo que necesitamos desde cero, gastando mucho tiempo y esfuerzo;
- crear lo que necesitamos basado en algo que ya existe.
La estrategia más óptima es:
tomar una solución existente que sea buena, hacerle algunas
mejoras, adaptarla a nuestras necesidades y usarla
.
Si seguimos la historia de la aparición del ser humano, resulta que desde el
origen de la vida en el planeta han pasado miles de millones de años. Y si asumimos
que el ser humano apareció a partir de un simio (basado en un simio), entonces solo han
pasado un par de millones de años.
Crear desde cero lleva más tiempo. Mucho más tiempo
.
En programación también existe la posibilidad de crear una clase basada
en otra.
La nueva clase se convierte en descendiente (heredero) de la clase ya
existente
. Esto es muy beneficioso cuando hay una clase que contiene el
80%-90% de los datos y métodos que necesitamos.
Simplemente declaramos la clase adecuada como padre de nuestra nueva clase,
y entonces, en la nueva clase, automáticamente aparecen todos los datos y
métodos de la clase padre
. ¿Verdad que es conveniente?
2.5 Polimorfismo
El polimorfismo es un concepto del ámbito de la programación. Describe una situación en la que detrás de una interfaz se esconden diferentes implementaciones. Si intentamos buscar análogos en la vida real, uno de esos análogos sería el proceso de conducir un automóvil.
Si una persona puede manejar un camión, también podría manejar una ambulancia,
y un coche deportivo.
Una persona puede manejar un coche independientemente de qué tipo de coche sea,
porque todos tienen la misma interfaz de manejo: volante, pedales y palanca
de cambios
. El mecanismo interno de los coches es diferente, pero todos
tienen la misma interfaz de manejo.
Si volvemos a la programación, el polimorfismo permite
interactuar de manera uniforme con objetos de diferentes clases (generalmente
que tienen un ancestro común) – algo que es difícil de sobreestimar
.
Su valor aumenta cuanto más grande es el programa.
POO son principios. Leyes internas.
Cada uno de ellos nos limita en algo, pero nos da a cambio
grandes ventajas cuando el programa crece hasta alcanzar un tamaño
considerable
. Los cuatro principios de la POO son como las cuatro patas de
una silla. Si quitas al menos una, todo el sistema se vuelve inestable.
GO TO FULL VERSION