Blog / Programación orientada a objetos: ¿Qué es y para qué sirve?

Programación orientada a objetos: ¿Qué es y para qué sirve?

La Programación Orientada a Objetos es un paradigma de programación, lo que se define como un modelo del diseño de sistemas de software.

La base de este paradigma se centra en las clases y los objetos. Esto quiere decir que separa y estructura el código en fragmentos más simples y reutilizables como lo son las clases y nos permite instanciar (plasmar la forma de estas plantillas de código) en objetos.

¿Por qué este paradigma es tan importante?

👉 La OOP nos permite reutilizar, organizar y mantener el código.

👉 Nos ayuda a NO repetir el código (siguiendo el principio DRY - Dont Repeat Yourself) y permite que varios devs puedan interactuar, modificar y utilizar el mismo código evitando complicaciones.

👉 Evita comportamientos inadecuados de las entidades y modelos del sistema mediante la encapsulación y la abstracción.

👉 Ayuda a que el código sea reutilizable nucleando funcionalidades de nuestros sistemas en sus modelos (objetos/clases).

Los 4 pilares de la OOP

💡 El primer y más importante concepto que tenemos que tener en cuenta a la hora de hablar de POO es la distinción entre clase y objeto.

Una clase es una plantilla. Define de manera genérica cómo van a ser los objetos de un determinado tipo y un objeto es la implementación de esa plantilla.

Veámoslo con un ejemplo no tan abstracto. Supongamos que estamos en un juego y tenemos que crear nuestro propio player.

El juego nos da un personaje por default al que vamos a cambiarle el pelo, la ropa, las herramientas que tenga para personalizarlo y ser únicos en el juego. Este player por default es la clase Player. Y nuestra personalización es un objeto. Cada jugador tendrá su personaje personalizado que es su propia instancia de la clase Player.

💡 El segundo concepto a entender es la diferencia entre atributo y método.

Los atributos son propiedades del objeto que lo enmarcan y le dan forma. Estos pueden ser por ejemplo un id, nombre, etc. También pueden ser acciones que puede realizar y los mismos pueden ser implementados como métodos. Los métodos de la clase son funciones que el objeto puede invocar (por ejemplo, hablar, caminar, respirar en el objeto de una persona).

Siguiendo el ejemplo anterior, todos los Players tendrán un atributo que es una herramienta que los ayudará en el juego. Algunos elegirán un hacha, otros una maza y así. Sin embargo, todos cuentan con su atributo Tool. Cuando entren al juego, lo primero que van a hacer es querer moverse por el plano que nos ofrece el mismo. Para eso, nuestra clase Player, necesita un método común a todas sus instancias que va a ejecutar la acción de moverse por el plano. Por eso, la clase tendrá su método Move.

1. Abstracción

La abstracción tiene dos puntos. Lo primero es que nos permite ocultar del usuario el funcionamiento interno de nuestro sistema. Por ejemplo exponer en una GUI (Interfaz Gráfica) un botón de comprar con lo que entiende que puede comprar su producto con un click en ese botón sin saber qué sucede de fondo en nuestro sistema. También nos permite abstraer de los desarrolladores las funcionalidades internas de la clase. Permitiendo que los desarrolladores utilicen y manipulen la clase sin necesidad de entender qué sucede internamente en la misma.

Por otro lado, nos permite abstraer del código estas entidades dándoles una forma y una representación que nos permita entender de otra forma de qué se trata el fragmento de código que la conforma. Un ejemplo de esto es cuando definimos una clase como Usuario.

2. Herencia

La herencia es la cualidad que nos permite reutilizar nuestro código y modelos plasmados en forma de clase implementando subclases. Las nuevas clases heredaran (como en la herencia genética) atributos y métodos de las clases padres o superclases. Este tipo de implementación de clases y super clases nos ayuda a crear sistemas escalables y con multiplicidad de opciones. Podemos ver esta característica en sistemas de ecommerce en los que tenemos diferentes tipos de usuarios(superclase) en los que unos se definen como compradores y otros como vendedores; también así en los productos y sus categorías.

3. Polimorfismo

El polimorfismo nos permite modificar ligeramente los métodos y atributos de las subclases previamente definidas en la superclase.

Para entender mejor el polimorfismo podemos entenderlo bajo el aspecto de un sistema de usuarios en una plataforma de streaming de películas. Podemos tener usuarios con diferentes características pero un modelo similar, como es el caso de usuarios menores de edad a los que se les asignan cierto contenido que pueden ver dependiendo de su edad. Sin embargo el resto de los métodos y atributos de la clase Usuario las comparte con otros usuarios.

4. Encapsulación

El proceso de encapsulación nos permite proteger los datos y la integridad de nuestro sistema mediante la privacidad de los mismos.

Existen diferentes tipos de encapsulación dependiendo del lenguaje. En casos como Typescript contamos con la posibilidad de encapsular los datos en el scope de la clase (private) y las subclases (protected). Como también existe la posibilidad de encapsular la modificación de datos permitiendo que la instancia de la misma solo pueda leer el dato (readonly) pero no modificarlo.

Con estas posibilidades podemos proteger los procesos de nuestro sistema tanto de los usuarios como de otros desarrolladores definiendo las posibilidades acceso de cada atributo y método.

Beneficios de Programación Orientada a Objetos

A modo de resumen, repasemos algunos conceptos y beneficios de encarar nuestro desarrollo siguiendo el paradigma orientado a objetos.

✅ Nos permite reutilizar y evitar la duplicación de código mediante una arquitectura basada en clases. Convierte desarrollos complejos en estructuras simples y reproducibles.

✅ Nos permite trabajar en equipo gracias al encapsulamiento y la abstracción, ya que minimiza la posibilidad de duplicar funciones cuando varias personas trabajan sobre un mismo objeto al mismo tiempo y hace las entidades de nuestro sistema más entendibles para las personas que trabajan sobre él.

✅ Al estar la clase bien estructurada permite la corrección de errores en varios lugares del código ya que si un método provoca errores en nuestro software, sólo dedicaremos nuestro tiempo en arreglar ese método y no varias líneas de código.

Protege la información a través de la encapsulación, ya que solo se puede acceder a los datos del objeto a través de propiedades y métodos privados. La abstracción también nos permite construir sistemas más complejos y de una forma más sencilla y organizada.

Ejemplos y aplicación

Para ver más en profundidad este tema, te recomendamos el siguiente video dónde realizamos varios ejercicios utilizando TypeScript y este paradigma de programación orientada a objetos 👇👇👇