2.1 Conceptos básicos de OOP
La base del enfoque orientado a objetos en programación es la paradigma de OOP. 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 es proporcionado por sus datos, que se almacenan en sus variables internas. El comportamiento del objeto es el conjunto de todas las acciones que realizan sus métodos.
Hay miles de objetos en un programa promedio, y millones en uno grande. Para reducir el caos, se decidió organizar los objetos en clases, y las clases de objetos en una especie de jerarquía.
Cada objeto tiene una clase, con la cual es creado. Por un lado, una clase es un tipo de plantilla de objeto, y por otro, es un objeto independiente con sus propias características (de las cuales hablaremos más adelante).
Para entender mejor el concepto de clases, revisa las siguientes definiciones:
Clase — es una plantilla o esquema para crear objetos, que define los atributos y métodos característicos para todos los objetos de este tipo. Las clases permiten organizar los datos y las funciones que trabajan con esos datos en un todo unificado.
Objeto — instancia de una clase. Cada objeto tiene un estado (definido por los atributos) y un comportamiento (definido por los métodos).
Encapsulación — consiste en ocultar la implementación interna de una 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 — permite que una clase (hija) herede los atributos y métodos de otra clase (padre). Esto facilita la reutilización del código y simplifica su mantenimiento.
Polimorfismo — permite usar una única interfaz para trabajar con objetos de diferentes clases. Esto se logra mediante la redefinición de métodos en las clases hijas que se heredan de los padres.
Abstracción — consiste en identificar las características comunes de los objetos y crear clases que representen esas características comunes. Esto ayuda a simplificar sistemas complejos y mejorar su comprensión.
Si entendiste al menos la mitad, ¡genial! En lo que sigue, desglosaremos cada uno de estos puntos en más detalle.
2.2 Abstracción
Un buen ejemplo de abstracción en la vida real es la descripción de los cargos en una empresa u organización. El nombre del cargo es una cosa, y las responsabilidades de cada cargo específico son otra completamente diferente.
Imagina que estás diseñando la estructura de tu futura empresa. Puedes dividir las responsabilidades del secretario: "distribuirlas" entre varios otros cargos. Puedes dividir el cargo de director ejecutivo en varios cargos independientes: director financiero, director técnico, director de marketing, director de RRHH. O, por ejemplo, fusionar los cargos de gerente de oficina y reclutador en uno solo.
Desde el punto de vista de la programación, la abstracción es, por así decirlo, una separación adecuada del programa en objetos. Generalmente, cualquier programa grande puede representarse de docenas de maneras como objetos interactuantes. Abstracción permite seleccionar las características principales y omitir las secundarias.
Abstracción es como la estrategia en asuntos militares. Una mala estrategia, y ninguna táctica brillante podrá corregir la situación.
2.3 Encapsulación
El objetivo de la encapsulación es mejorar la calidad de la interacción de las cosas simplificándolas.
Y la mejor manera de simplificar algo es ocultar todas las cosas complejas de la vista ajena. Por ejemplo, si te sientas en la cabina de un Boeing, no entenderás de inmediato cómo manejarlo:
Por otro lado, para los pasajeros del avión todo se ve más sencillo: compraste un billete, te subes al avión, despegas y aterrizas. Puedes volar fácilmente de continente a continente, teniendo solo las habilidades de "comprar un billete" y "subirte al avión". Todas las complejidades en forma de preparación del avión para el vuelo, despegue, aterrizaje y varias situaciones de emergencia están ocultas de nosotros. Sin mencionar la navegación por satélite, el piloto automático y los centros de control en los aeropuertos. Y eso nos facilita la vida.
Desde el punto de vista de la programación, encapsulación es "ocultamiento de la implementación". Me gusta esta definición. Nuestra clase puede contener cientos de métodos y realizar un comportamiento muy complejo en diversas situaciones. Pero podemos ocultar de las miradas curiosas todos sus métodos (encapsular sus nombres con "__" en ambos lados), 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 solo esos tres métodos en esta clase, y llamarán a ellos. Y todas las complejidades estarán ocultas dentro de la clase, como la cabina de los pilotos de los felices pasajeros.
2.4 Herencia
La herencia tiene dos lados: el lado de la programación y el lado de la vida real. Desde el punto de vista de la programación, herencia — es una relación especial entre dos clases. Pero es aún más interesante qué es la herencia desde el punto de vista de la vida real.
Si necesitáramos crear algo en la vida real, tendríamos dos soluciones:
- crear lo que necesitamos desde cero, gastando mucho tiempo y esfuerzo;
- crear lo que necesitamos basado en algo ya existente.
La estrategia más óptima es así: tomamos una buena solución existente, la mejoramos un poco, la adaptamos a nuestras necesidades y la usamos.
Si seguimos la historia de la aparición del ser humano, parecerá que desde el origen de la vida en el planeta han pasado miles de millones de años. Pero si imaginamos que el humano surgió del mono (basado en el mono), 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 una ya existente. Esto es muy ventajoso 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 aparecen automáticamente todos los datos y métodos de la clase padre. Conveniente, ¿verdad?
2.5 Polimorfismo
Polimorfismo es un concepto del ámbito de la programación. Describe una situación en la que diferentes implementaciones se esconden tras una sola interfaz. Si tratamos de buscar sus análogos en la vida real, uno de esos análogos sería el proceso de conducir un automóvil.
Si una persona puede conducir un camión, se le puede sentar al volante de una ambulancia y de un automóvil deportivo. Una persona puede conducir un coche independientemente de qué coche sea, porque todos ellos tienen la misma interfaz de control: volante, pedales y palanca de cambios. El mecanismo interno de los coches es diferente, pero todos tienen la misma interfaz de control.
Volviendo a la programación, el polimorfismo permite interactuar uniformemente con objetos de diferentes clases (generalmente con un ancestro común) — algo que es difícil de sobrevalorar. Su valor es mayor cuanto más grande es el programa.
OOP son principios. Leyes internas. Cada uno de ellos nos limita en algo, a cambio de ofrecer grandes ventajas cuando el programa crece a tamaños grandes. Cuatro principios de OOP son como las cuatro patas de una silla. Quita aunque sea una, y todo el sistema se volverá inestable.
GO TO FULL VERSION