Introducción a la POO por EDteam
Video
#OOP #CsharpTable of Contents:
- 1 - Paradigmas: Programación Estructurada vs Orientada a Objetos
- 2 - ¿Qué son los objetos?
- 3 - EJEMPLO 2: ¿Cómo usar Objetos en una Aplicación Real? - Sistema de Suscripción de Usuarios
- 4 - Los 4 Pilares de la Programación Orientada a Objetos
- 4.1 - Abstracción - identificar atributos y métodos 🤔💡
- 4.2 - Encapsulamiento - protege los datos de los objetos 🔒💊
- 4.3 - Polimorfismo - usar "interfaces" para invocar métodos de diferentes objetos que tienen funcionalidades similares, pero procedimientos distintos 📣 👯♀️
- 4.4 - Herencia - crear "Clases hijas" a partir de "Clases padres" 👨👦
- Z) Glosario
1 - Paradigmas: Programación Estructurada vs Orientada a Objetos
El tema de hoy es la Programación Orientada a Objetos
¿que tienen que ver estos dos conceptos?
- la programación
- y los objetos
Los objetos son cosas como:
- la computadora
- el teléfono
- los automoviles
- las personas
- los animales
- etc.
Lo que pasa es que la programación es muy amplia y hay varias formas de programar. Existe algo llamado los paradigmas de programación. Estos "paradigmas" son estilos o formas de programar.
https://ed.team/cursos/paradigmas
¿Cómo funciona la Programación Estructurada?
El paradigma con el que a nosotros nos enseñan a programar es el paradigma secuencial o estructurado, es decir las instrucciones van de arriba a abajo, una después de otra.
Es la manera más sencilla de aprender a programar, no tenemos que abstraer cosas complejas sino simplemente:
- damos una serie de ordenes,
- leemos datos,
- los manipulamos con alguna operación,
- ponemos una condicional para validar ese resultado
- y según el resultado mandamos una cosa u otra
Así aprendimos todos a programar, pero cuando empiezas a ir a proyectos un poco más grandes te das cuenta que esto no te ayuda mucho.
1.1 - EJEMPLO 1: Comparando Paradigmas de Programación - Crear una Tienda en Línea
Por ejemplo, un cliente pide una tienda en línea donde él va a vender zapatos.
Entonces tienes que pensar de una manera muy diferente...
¿cómo vas a hacer de arriba hacia abajo ese programa? ¿es siquiera eso posible?
🤔🤔🤔🤔🤔
Una tienda en línea para vender zapatos tiene:
-
los zapatos (que pueden tener: un precio, un color, una talla, una marca)
-
el carrito de compra, (que debe conectarse con una pasarela de pago para recibir las transacciones)
-
los usuarios (que van a hacer las compras)
son muchas cosas que no pueden escribirse de arriba hacia abajo...
- Solución con Programación Orientada a Objetos
Necesitamos otra forma de programar para lograr hacer esta tienda en linea. Necesitamos usar el paradigma de la programación orientada a objectos.
El paradigma más usado en el mundo (no el mejor porque eso es relativo, pero si el más usado en el mundo) es la programación orientada a objectos porque cada uno de estos elementos que necesita el sistema como:
- el carrito
- el producto
- el usuario
- etc.
cada uno de esos elementos es un objeto en este paradigma y esos objetos tienen:
- sus propios datos (atributos)
- y tienen su propio comportamiento su propia funcionalidad (métodos)
Por ejemplo:
-
Los "productos" (en este caso, los zapatos) tienen:
- Datos: como precio, marca, nombre
- Funcionalidad: se pueden agregar al carrito y se pueden comprar
-
Los "usuarios" tambien tienen:
- Datos: nombre de usuario, contraseña, n° de tarjeta de credito
- Funcionalidad: pueden comprar productos, hacer listas, agregar al carrito
-
El "carrito" tambien tiene:
- Datos: registro de productos agregados por el usuario, nombre del usuario que llenó el carrito
- Funcionalidad: generar orden de compra y llevarla a la pasarela de pago, etc.
En resumen: cada uno de esos elementos en los que nosotros vamos dividiendo el sistema es un objeto y los objetos tienen datos y tienen funcionalidad.
1.2 - Ventajas de la Programación Orientada a Objetos
Entonces con la programación orientada a objetos pasamos de tener un codigo de arriba hacia abajo (en el que las funcionalidades están todas metidas y que es muy difícil de separar y de escalar).
A un sistema en el que tenemos objetos separados y que se comunican entre ellos.
Por ejemplo, en la tienda en linea existe el "usuario" que se comunica con el "producto" para comprarlo. El "producto" que se comunica con el "carrito", el "carrito" con la "pasarela de pago" y a la vez con el "usuario" etcétera...
Los objetos se comunican entre ellos, entonces de esta manera es más fácil manejar y mantener un sistema y hacerlo crecer. Si luego necesitamos otra funcionalidad podemos agregar otro objeto o incluso agregarle atributos o funcionalidad a los objetos que ya existen.
2 - ¿Qué son los Objetos?
Repasemos, ¿qué son los objetos?
-
Los objetos son elementos que usamos para dividir un sistema en partes más pequeñas que interactúan entre si.
-
Y cada uno de estos objetos tiene:
- Atributos (datos)
- y Métodos (funcionalidad).
Para poder dividir nuestro sistema, necesitamos ser capaces de identificar los objetos que lo componen, para esto es necesario pensar y hacer una "abstraccion" del sistema para comprenderlo y enfocarnos en la programación.
La abstracción en la programación orientada a objetos es el proceso de identificar los aspectos esenciales de una entidad, separándolos de los más complejos o menos esenciales. En otras palabras, es una simplificación que permite al programador centrarse en lo que un objeto "hace", en lugar de "cómo lo hace".
2.1 - Ejemplo de "Abstracción" - ¿cómo definir al usuario de una tienda en línea?
Para entender mejor que es la Abstraccion, imagina que queremos realizar el sistema de usuarios de una tienda en linea.
Entonces, antes de empezar a programar hacemos un proceso llamado abstracción. Y nos ponemos a pensar que atributos y qué métodos debería tener este usuario para nuestra aplicación. 🤔🤔🤔
Entonces luego de esa reflexión nosotros llegamos a la conclusión que nuestro usuario debe tener los siguientes atributos:
- nombres
- apellidos
- correo
- contraseña
- y saber si es usuario premium que paga una suscripción con beneficios
Y tambien debe de tener, los siguientes métodos:
- Iniciar sesion
- Cerrar sesion
- Editar Perfil
- Cambiar contraseña
- Pasar a premium
- Publicar en comunidad
2.1.1 - Clase: la "plantilla" de los Objetos
Este objeto de "usuario" se crea en código obviamente...
Pero te imaginas que para cada vez que un usuario quiera registrarse, que pueden ser miles de personas, llamemos al programador y lo pongamos escribir código para cada usuario...
no sería eficiente... tendríamos una cola de cientos de usuarios esperando que el programador termine con el actual para pasar al siguiente.
¿Como resolvemos ese problema de crear miles de usuarios?
Sencillo usamos algo llamado Clase.
La clase es una plantilla, es un molde que tiene la estructura básica del objeto, y define sus atributos y sus métodos.
Entonces en el proceso de abstracción que vimos hace un momento, no creamos realmente el objeto usuario creamos la plantilla la clase usuario.
Entonces cada vez que una persona llega a la tienda en linea, se registra y crea su cuenta, realmente está usando la clase que ya hemos creado y que ya está en nuestro código para crear nuevos objetos usuario.
A ese proceso de crear objetos a partir de una plantilla llamada clase se llama instanciar.
Veamos algunos ejemplos de lo que podemos considerar una plantilla o clase:
-
El Plano de una Casa ---> La Casa Construida
-
El Dibujo de un Vestido de diseñador ---> Los Vestidos de diferentes tallas
2.1.2 - Instanciar/Crear Objetos a partir de una Clase
En resumen: instanciar es crear un objeto a partir de una clase, por eso es que cada uno de esos objetos también se le llama "instancia".
Y el beneficio es que solo escribimos el codigo una vez, y la creación de objetos ya sabe que atributos y metodos debe utilizar por cada nueva instancia.
class Usuario:
def __init__(self, nombres, apellidos, correo, contrasena, premium=False):
# Inicialización de la clase Usuario con atributos básicos y estado premium opcional
self.nombres = nombres
self.apellidos = apellidos
self.correo = correo
self.contrasena = contrasena
self.premium = premium
def iniciar_sesion(self):
# Método para manejar la lógica de inicio de sesión del usuario
print(f"{self.nombres} ha iniciado sesión.")
def cerrar_sesion(self):
# Método para manejar la lógica de cierre de sesión del usuario
print(f"{self.nombres} ha cerrado sesión.")
def editar_perfil(self, nuevos_nombres, nuevos_apellidos, nuevo_correo):
# Método para actualizar los atributos del perfil del usuario
self.nombres = nuevos_nombres
self.apellidos = nuevos_apellidos
self.correo = nuevo_correo
print(f"Perfil actualizado a: {self.nombres} {self.apellidos}, Email: {self.correo}")
def cambiar_contrasena(self, nueva_contrasena):
# Método para cambiar la contraseña del usuario
self.contrasena = nueva_contrasena
print("La contraseña ha sido actualizada exitosamente.")
def pasar_a_premium(self):
# Método para cambiar el estado del usuario a premium
self.premium = True
print("La cuenta ahora es premium.")
def publicar_en_comunidad(self, mensaje):
# Método para permitir que el usuario publique un mensaje en la comunidad
print(f"{self.nombres} ha publicado un mensaje en la comunidad: {mensaje}")
# Ejemplo de cómo crear un objeto usuario y utilizar sus métodos
usuario1 = Usuario("Juan", "Pérez", "juan.perez@email.com", "contraseña123")
usuario1.iniciar_sesion()
usuario1.editar_perfil("Juan Alberto", "Pérez Gómez", "juan.a.perez@email.com")
usuario1.cambiar_contrasena("nuevaContraseña!456")
usuario1.pasar_a_premium()
usuario1.publicar_en_comunidad("¡Hola comunidad!")
usuario1.cerrar_sesion()
3 - EJEMPLO 2: ¿Cómo usar Objetos en una Aplicación Real? - Sistema de Suscripción de Usuarios
En este ejemplo tenemos a un señor llamado Alexis,
y Alexis ha descubierto una plataforma de cursos en línea de programación que se llama EDteam.
A Alexis le parece interesante y se registra.
Entonces en el proceso de registro, Alexis invoca a la clase usuario
y la instancia para crear su usuario.
Alexis acaba de crear su usuario con su proceso de registro. Ese nuevo usuario es el usuario 528 que tiene como nombre "Alexis" y como apellido "Losada".
Este usuario empieza a consumir los cursos gratuitos de EDteam y le gusta. Entonces decide pasar a premium. El usuario escoge un plan mensual e introduce sus datos de pago (tarjeta o Paypal).
En ese momento lo que está haciendo el usuario es llamar a la clase orden de compra y esa clase orden de compra instancia a un objeto, una orden de compra asociada a este usuario.
Esta orden de compra se debe procesar, si el proceso es correcto y se valida el pago, está orden de compra llama a otra clase. Esta clase es la clase premium
y esta clase premium se instancia y crea un objeto premium con referencia al usuario que realizó la compra
y se le asigna el estado premium al usuario. Finalmente, ya puede ver todos los cursos de EDteam.
Entonces recuerda que las clases ya están allí en el sistema, son todos esos cubos grises y en el proceso se van a instanciar para crear objetos reales. Así un funciona la programación orientada a objetos.
4 - Los 4 Pilares de la Programación Orientada a Objetos
Como paradigma la programación orientada a objetos se basa en cuatro pilares que son:
Estos cuatro conceptos son la base de la programación orientada a objetos y pueden ser un poco confusos de entender al comienzo, así que atento a lo siguiente...
4.1 - Abstracción - identificar atributos y métodos 🤔💡
De la abstracción ya hablamos hace un momento, ¿te acuerdas?
Cuando queríamos crear un usuario, el proceso de abstracción era pensar qué atributos y qué métodos va a tener la clase.
Obviamente cuando creamos un sistema nosotros tenemos que hacer una abstracción para todas las clases, nosotros tenemos que hacer ese proceso mental de abstracción, de pensar qué atributos y qué métodos va a tener cada clase.
Recuerda que nos importa lo que un objeto "hace", en lugar de "cómo lo hace".
4.2 - Encapsulamiento - protege los datos de los objetos 🔒💊
Ahora revisaremos el encapsulamiento.
Como hemos visto los objetos se comunican entre ellos, esto podría traer problemas de seguridad si un objeto pudiera modificar los datos de cualquier otro.
Entonces se necesita proteger la información de manipulaciones no autorizadas de tal manera que cuando se comunican los objetos hay caminos que se pueden seguir y caminos que no.
Tenemos:
- datos protegidos
- datos privados
- datos públicos
- métodos para acceder a cierta información
- objetos que no pueden acceder a cierta información o ciertos métodos de otros objetos
- etc
de esa manera tenemos organizado el sistema, porque imagínate que cualquier objeto puede acceder a cualquier información o realizar cualquier cambio no debido. Se podría colapsar el sistema.
4.3 - Polimorfismo - usar "interfaces" para invocar métodos de diferentes objetos que tienen funcionalidades similares, pero procedimientos distintos 📣 👯♀️
Ahora revisaremos el polimorfismo y para explicártelo recordemos este gráfico del señor Alexis convirtiéndose en premium...
Cuando él se convierte a premium se notifica vía tres canales:
- slack - la notificación slack es interna y privada para el equipo de EDteam.
- web - notificación para el usuario
- y correo - confirmación adicional al correo del usuario
Si se dan cuenta, tiene la misma funcionalidad la notificación aunque internamente cada uno de esos métodos funciona diferente.
Es decir la notificación slack tiene sus propios métodos y propia lógica (una API, etc), igual para la web e igual para el correo, usan una API diferente pero en esencia es la misma función, es la misma acción y eso nos simplifica mucho el trabajo porque podemos dar órdenes coherentes a varios objetos sin preocuparnos de como internamente ellos las ejecuten.
En otras palabras, nos dieron una orden y cada uno la cumple a su propia manera en particular.
Eso es el polimorfismo, poder darle la misma orden a diferentes objetos y que cada uno de ellos responda de su propia manera.
El Polimorfismo nos permite interactuar con diferentes objetos a través de una interfaz común, permitiendo que diferentes objetos respondan de manera diferente al mismo mensaje o método invocado. Esto significa que podemos usar objetos de diferentes clases de manera intercambiable, siempre y cuando compartan la misma interfaz o clase base.
4.4 - Herencia - crear "Clases hijas" a partir de "Clases padres" 👨👦
El último concepto es la herencia este quizás es el más fácil de entender porque tiene mucha relación con el mundo real, por ejemplo mis hijos han heredado muchas cosas mías tanto atributos como funcionalidades.
Por ejemplo,
- en atributos el color de los ojos, del cabello, de la piel
- la funcionalidad, por ejemplo el carácter o la personalidad
Sin embargo ninguno de mis hijos es una copia exacta de mí, ellos tienen sus propios atributos su propia personalidad y su propia funcionalidad, etc.
En la programación orientada a objetos tambien tenemos una clase padre y las clases hijas heredan funcionalidades y atributos de esta clase padre pero no son idénticos, solamente aprovechan eso que ya existe y luego se le añaden nuevas cosas.
Por ejemplo,
Ya tenemos una clase para crear usuarios, ¿se acuerdan?
Podemos crear un usuario genérico, pero que pasa si luego decimos: necesitamos un usuario diferente que sea "staff" solamente. Estas cuentas serán para los trabajadores de EDteam, y estas cuentas deben tener diferentes funcionalidades y diferentes atributos al usuario común.
Entonces ¿qué hacemos?
Heredamos y creamos una nueva clase que heredé de la clase padre y esa clase va a ser staff y ahí podemos poner a los miembros del equipo.
Luego decimos que necesitamos otro tipo de usuario que sea profesor, porque el profesor tiene otro tipo de funcionalidad y otro tipo de atributos. Entonces también heredamos de la clase usuario y creamos la clase profesor. Y a partir de esa clase de profesor creamos todos los profesores de EDteam.
Y por último decimos que queremos meter invitados, por ejemplo gente que sin pagar una suscripción pueda tener acceso para los sorteos o para las premiaciones o las campañas que hacemos entonces creamos un rol invitado
y de esa manera podemos crear clases hijas con la herencia.
Z) Glosario
File | Definition |
---|