Está en la página 1de 26

Lenguajes Orientados a Objetos 4/36

Algunos de los lenguajes de programación Orientados a Objetos son:

 Java:

– Orientado a Objetos naturalmente

– Es muy útilizado en Android

– Y es usado del lado del servidor o Server Side

 PHP

– Lenguaje interpretado

– Pensado para la Web

 Python

– Diseñado para ser fácil de usar

– Múltiples usos: Web, Server Side, Análisis de Datos, Machine Learning, etc

 Javascript–

-Lenguaje interpretado

– Orientado a Objetos pero basado en prototipos

– Pensado para la Web

 C#
 Ruby
 Kotlin

Instalando Visual Studio Code 5/36

Diagramas de Modelado 6/36


OMT: Object Modeling Techniques. Es una metodología para el análisis orientado a
objetos.
UML: Unified Modeling Language o Lenguaje de Modelado Unificado. Tomó las bases
y técnicas de OMT unificándolas. Tenemos más opciones de diagramas como lo son
Clases, Casos de Uso, Objetos, Actividades, Iteración, Estados, Implementación.

UML 7/36
Como ya viste UML significa Unified Modeling Language el cual es un lenguaje
estándar de modelado de sistemas orientados a objetos.

Una forma de representar las relaciones que tendrá un elemento con otro es a través de
las flechas en UML, y aquí tenemos varios tipos, estos son los más comunes:

Esto significa que tendremos una manera gráfica de representar una situación, justo
como hemos venido viendo. A continuación te voy a presentar los elementos que puedes
utilizar para hacer estas representaciones.

Las clases se representan así:

En la parte superior se colocan los atributos o propiedades, y debajo las opera ciones de
la clase. Notarás que el primer caracter con el que empiezan es un símbolo. Este
denotará la visibilidad del atributo o método, esto es un término que tiene que ver con
Encapsulamiento y veremos más adelante a detalle.

Estos son los niveles de visibilidad que puedes tener:

 **** private**+** public**#** protected**~** default

Asociación:

Como su nombre lo dice, notarás que cada vez que esté referenciada este tipo de flecha
significará que ese elemento contiene al otro en su definición. La flecha apuntará hacia
la dependencia.

Con esto vemos que la ClaseA está asociada y depende de la ClaseB.


Herencia

Siempre que veamos este tipo de flecha se estará expresando la herencia.La dirección de
la flecha irá desde el hijo hasta el padre.

Con esto vemos que la ClaseB hereda de la ClaseA

Agregación

Este se parece a la asociación en que un elemento dependerá del otro, pero en este caso
será: Un elemento dependerá de muchos otros. Aquí tomamos como referencia la
multiplicidad del elemento. Lo que comúnmente conocerías en Bases de Datos como
Relaciones uno a muchos.

Con esto decimos que la ClaseA contiene varios elementos de la ClaseB. Estos
últimos son comúnmente representados con listas o colecciones de datos.

Composición

Este es similar al anterior solo que su relación es totalmente compenetrada de tal modo
que conceptualmente una de estas clases no podría vivir si no existiera la otra.

Con esto terminamos nuestro primer módulo. Vamos al siguiente para entender cómo
podemos hacer un análisis y utilizar estos elementos para construir nuestro diagrama de
clases de Uber.
Objetos 8/37
-Cuando tengamos un problema lo primero que debemos hacer es identificar objetos.

Los objetos son aquellos que tienen propiedades y comportamientos, además siempre
serán sustantivos.

Estos pueden ser físicos (una manzana por ejemplo) o conceptuales, por ejemplo algo
conceptual tiene propiedades pero no existe, puede estar en nuestra imaginación o son
simbologías de algo.

Un ejemplo más real:

Tenemos dos objetos, el usuario y la sesión.

El objeto User es un caso físico porque podemos tocarlo y vive realmente.

En cambio la Session es un objeto conceptual, este tiene comportamientos y atributos,


por ejemplo la fecha de cuando se hizo la session.

Propiedades:

También pueden llamarse atributos serán sustantivos: nombre, tamaño, forma, estado.

Son todas las características de ese objeto

No confundir con el valor, por ejemplo en un objeto libro tenemos 3 atributos, nombre,
color, tamaño:

El Pet Sematary no es el atributo, Nombre si es atributo

Verde no es el atributo, Color si es atributo.

Comportamientos:

Serán todas las operaciones del objeto, suelen ser verbos o sustantivo y verbo.

Por ejemplo: login(), logout(), makeReport()


Más ejemplos:

Vamos a ver el caso anterior en un contexto:

Podemos tener un sistema de adopciones, donde tenemos un catálogo de perros


disponibles para adoptarse.

Algunos comportamientos y propiedades pueden cambiarse.

Abstracción y Clases 9/37


En la clase anterior definimos el objeto del perro, pero si quisiéramos crear nuevos
perros podemos utilizar las clases.

Clase:

 Es el modelo sobre el cual se construirá nuestro objeto


 Me permiten generar más objetos

Funciona como una especie de molde.

Analizamos Objetos para crear Clases.

Las Clases son los modelos sobres los cuales construiremos nuestros objetos.

Abstracción es cuando separamos los datos de un objeto para generar un molde.

Modularidad 10/37
La modularidad va muy relacionada con las clases y es un principio de la
Programación Orientado a Objetos y va de la mano con el Diseño Modular que significa
dividir un sistema en partes pequeñas y estas serán nuestros módulos pudiendo
funcionar de manera independiente.

La modularidad de nuestro código nos va a permitir


 Reutilizar
 Evitar colapsos
 Hacer nuestro código más mantenible
 Legibilidad
 Resolución rápida de problemas

Una buena práctica es separando las clases en archivos diferentes.

Modular nos permite:

 Reutilizar código.
 Evitar colapsos.
 Código más mantenible.
 Mayor legibilidad
 Rápida resolución de problemas.

Principios de las clases:

 Modularidad
 Divide el programa en diferentes partes o módulos / clases
 Separar las clases en archivos (buena práctica)

Analizando Uber en Objetos 11/37


1- Hay una necesidad de trasladarnos de un punto A a un punto B

Es necesario tener un teléfono

2- Solicitamos el auto, asignamos el punto A y B

3- En la app hay un catálogo de autos para elegir(uber x / uber pool / uber black/ uber
van)

También tenemos presente al Driver (conductor)

4- Confirmamos y realizamos el pago del monto


Análisis de objetos:

A- User: el que solicita el auto

B- Route: la ruta del viaje

C- Car : uberX, UberPool, UberBlack o Uber Van

D- Driver: el que maneja

E- Payment: Método de pago utilizado, Card, Paypal, Cash etc

F- Trip: captura quien realiza el viaje, a donde vas, y como realizas el pago

Reto 1: identificando objetos 12/37


Toma como referencia nuestro Sistema de Adopciones e identifica todos los objetos.

 Animal en adopcion
 Rescatista
 Adoptante
 Donaciones

Clases en UML y su sintaxis en código


13/37
Vamos a definir las clases y plasmarla en un diagrama UML

Proceso:

1- Identificar Problema

2- Identificar Objetos

3-Definir las clases

4- Implementar
Las clases en UML las podemos definir como una representación de un rectangulo, en
la parte superior está su nombre, en morado están los atríbutos y en azul los
comportamientos (funcionalidades de la clase)

Esto le da a la clase:

Una identidad, un estado y un comportamiento

Por ejemplo, si tuvieramos la clase persona y esta tuviera el atributo name y el


comportamiento de caminar, lo definimos de la siguiente forma

Durante el curso vamos a trabajar con 4 lenguajes, así se definen las clases en cada
uno

El caso de JavaScript es particular, este lenguaje lo maneja a través de prototipos, si


embargo, utiliza la POO para analizar problemas y poder plasmarlo en código. Al tener
prototipos utilizaremos funciones para definir clases

Java es muy estricto y necesitamos poner el tipo de dato.

Modelando nuestros objetos Uber 14/37


Analicemos los objetos y saquemos los atributos:

Cada objeto va a tener un id, esto es útil para cuando utilicemos base de datos
Qué es la herencia? 15/37
Don’t repeat yourself es una filosofía que promueve la reducción de duplicación en
programación, esto nos va a inculcar que no tengamos líneas de código duplicadas.

Toda pieza de información nunca debería ser duplicada debido a que incrementa la
dificultad en los cambios y evolución

La herencia nos permite crear nuevas clases a partir de otras, se basa en modelos y


conceptos de la vida real. También tenemos una jerarquía de padre e hijo.

Reutilización: es uno de los principios de la POO

La herencia es una pieza clave para reutilizar código, esta nos permite crear clases a
partir de otras

La clase padre (zona en rojo) en poo se encuentra siempre como la súper clase , y la
clases hijas serán las subclases

Ejemplo para identificar herencia, tenemos 3 clases: futbolista, entrenador y masajista.

Observamos que tienen en común 4 atributos, el identificador el nombre, el apellido y la


edad, y algunos métodos como concetrarce y viajar

Cuando detectamos que hay elementos repetidos me indica que tengo que hacer algo.
Podríamos generar una abstracción de esto, una clase que contenga todos estos
elementos en común
Aplicando Herencia a nuestro proyecto
Uber 16/37
Vemos que algunos objetos tienen muchos elementos en común y creamos una
super clase padre que tendrá la jerarquía principal de nuestras clases

En la clase de pagos:

Todos los elementos tienen en común que pertenencen a una clase llamada Payments,
esta clase contendra solamento el id

(las flechas vacian apuntan a la clase padre para ejemplificar la herencia)

Objetos uber:

los 4 objetos comparten atributos como la licencia, driver, passenger

Simplificación de nuestro modelo uber:

Reto 2: analicemos un problema 17/37


Imagina que nuestro sistema de adopciones creció y ahora ofrece adoptar pericos, loros,
gatos y hamsters.
Genera un nuevo análisis, aplica herencia para abstraer mejor el problema y lograr
modularidad en el software.

Comparte tus resultados en la sección de discusiones.

Otro más

Creando nuestras carpetas iniciales para


el curso 18/37

Definiendo clases en Java y Python 19/37


Creamos un archivo main en la carpeta de Java

En java necesitamos que el nombre de la clase sea el mismo que el del archivo

Tenemos un hola mundo en Java

Creamos una nueva clase: account con sus atributos y también la clase car

Clase payment:
Ahora con python

Hola mundo en Python

Creamos la primer clase en Python

Definiendo Clases en JavaScript 20/37


En JS el concepto de clases no existía como tal hasta el nuevo estándar EcmaScript 6. El
reto de encontrar sistemas construidos con este estándar es alto por esa razón te
explicaré cuál fue por mucho tiempo su equivalente.

Los Prototipos fue la forma de crear clases en JavaScript y las representaremos


partiendo de la declaración de una función.

Creemos nuestras clases:

 Account
 Car
 Payment
 Route

Para esto crearemos el siguiente sistema de archivos dentro de la carpeta JS de nuestro


proyecto:

 Account.js
 Car.js
 Payment.js
 Route.js
 index.js
El archivo index.js será el lugar equivalente al punto de entrada de la aplicación donde
estaremos declarando nuestros objetos basado en las clases. Para esta clase lo dejaremos
en blanco.

Ahora veamos el código archivo por archivo:

Como su nombre lo dice, notarás que cada vez que esté referenciada este tipo de flecha
significará que ese elemento contiene al otro en su definición. Si recuerdas la clase Car,
este contenía una instancia de Driver. La flecha apuntará hacia la dependencia.En este
código notarás el uso de la palabra reservada this. Normalmente cuando usamos la
sintaxis punto siempre lo haremos a partir de un objeto instanciado, en este caso con
this, se hace una simulación al objeto en cuestión, a pesar de que en ese momento
visualmente sigue siendo una clase.

Digamos que se adelanta un poco al momento de ejecución y visualiza al objeto con sus
atributos, más adelante verás la forma en que podemos asignar datos a un atributo del
objeto en otros lenguajes y verás que es exactamente la misma sintaxis.

Si intentaramos poner this. en el momento de ejecución nos traería un listado de todos


los componentes de la clase que en este caso son solo estos tres: id, init y end.

This hace referencia al objeto instanciado. Para comprender del todo esta última frase
mira la siguiente clase donde hablamos de objetos.

Objetos, método constructor y su sintaxis


en código 21/37
Los objetos nos ayudan a crear instancia de una clase, el objeto es el resultado de lo que
modelamos, de los parámetros declarados y usaremos los objetos para que nuestras
clases cobren vida.

Los métodos constructores dan un estado inicial al objeto y podemos añadirle algunos


datos al objeto mediante estos métodos. Los atributos o elementos que pasemos a través
del constructor serán los datos mínimos que necesita el objeto para que pueda vivir.
En JS reutilizamos la clase que ya cream

Objetos. Dando vida a nuestras clases en


Java y Python 22/37

Le damos de alta a otro objeto:

Vamos a la clase car (en su archivo correspondiente) y declaramos un método para traer
los datos de esa clase:

Y en la función Main.java llamo a este método

Ahora con Python:

Vamos a importar el elemento (car), import y el nombre de la clase (Car)


Declarando un Método Constructor en
Java y JavaScript 23/37
Creando el método constructor en Java:

Creamos un archivo index.html para poner la llamada los archivos .js

Ahora volvemos al index

Agregamos los archivos js al index

JavaScript orientado a objetos, lo más


nuevo 24/37
A partir de las nuevas especificaciones del EcmaScript 6 ya podemos declarar una clase
con la palabra reservada class, aunque es importante aclarar que estos no dejan de ser
prototipos, sino todo lo contrario.
Además tendremos una palabra clave para definir un constructor, y dentro de este
estarán las propiedades de nuestra clase definidas listas para inicializarse.

Transcribamos el código JavaScript que generamos en la clase anterior a este nuevo


estándar.

La clase Car quedaría así:

Si quisiéramos declarar un método, en esta nueva sintaxis dejaremos de utilizar la


palabra clave function.

Ahora veamos a la clase Account:

Y para finalizar aquí puedes ver las clases Route y Payment:

Notarás que para instanciar un objeto seguiremos usando la palabra clave new.

Y los resultados serán los mismos:

Aquí encuentras el código de este ejercicio:

https://github.com/anncode1/Curso-POO-Platzi/tree/3.1.POOJS

Declarando un Método Constructor en


Python 25/37
En Python encontrarás un concepto denominado Métodos Mágicos, estos métodos son
llamados automática y estrictamente bajo ciertas reglas. El método constructor en
Python forma parte de esta familia de métodos y como aprendimos en la clase anterior
lo declaramos usando init, aunque si nos ponemos estrictos este método no construye el
objeto en sí. El encargado de hacer esto es new y el método init se encargará de
personalizar la instanciación de la clase, esto significa que lo que esté dentro de init será
lo primero que se ejecute cuando se cree un objeto de esta clase.

Para nuestro proyecto tenemos la necesidad de que algunas variables se inicialicen


obligatoriamente cuando ocurra la instanciación. Así que declaremos el
método __init__ en las clases de nuestro proyecto con las propiedades obligatorias.

Para la clase Account quedaría algo así, notarás que usamos la palabra clave self, esta es
muy parecida a lo que venimos trabajando a otros lenguajes con this. Y como su
nombre lo dice hace referencia a los datos que componen la clase, en este
caso self.name está llamando al atributo name que se encuentra en la línea 3 de la
clase y, le está asignando el dato que se pasa en el método __init__ de la línea 8.

Ahora veamos la clase Car:

Lo que notarás de diferente es que cambiamos el tipo de dato de driver, ahora es de tipo
Account y como ves está solicitando los dos datos obligatorios para instanciar un objeto
de este tipo. Esto lo verás más en acción en el próximo fragmento de código del
archivo main.py. Además, mucho ojo, en la primera línea observamos que es importante
importar la clase para poderla usar.

Nuestro archivo main.py ahora se verá así:

Observa que estamos importando las dos clases que usaremos y las estamos
instanciando en los métodos constructores.

Los resultados serán los siguientes:

El código de este ejemplo lo encuentras en este enlace:

https://github.com/anncode1/Curso-POO-Platzi/tree/3.2.ConstructorPython

Aplicando herencia en lenguaje Java y


PHP 26/37
Lo mismo hago para UberPool, pero cambiandole el nombre

Creo el archivo de UberBlack y UberVan que son iguales, también solo difieren los
nombres

Solución del reto de herencia en PHP


27/37
Curso-POO-Platzi-97b1dac06054cdfcb5b4446b00446cc4c09fe35b.zip

Aplicando herencia en lenguaje Python y


JavaScript 28/37
JavaScript

En clases anteriores te expliqué cómo ejecutar herencia en estándares anteriores al


EcmaScript 6. Uno de los beneficios de utilizar este nuevo estándar que ejecutar
herencia es tan simple como utilizar la palabra reservada extends.

Ahora para utilizar una de las clases y crear un objeto, por ejemplo de UberX, no
olvides declarar la clase en el archivo index.html.
Nuestro ejemplo se verá así:

Otros tipos de Herencia 29/37


A partir de ahora las clases que estén siendo heredades las llamaremos familias.

Acabamos de aplicar herencia a la familia Car. Ahora apliquémosla a la


familia Payment.

En clases anteriores te mencioné que otro punto de partida que puedes tomar para
aplicar herencia es del hecho de que hay clases que lógicamente deberían estar en una
familia, como es el caso de Payment.

Repasemos el diagrama de Payment

Notarás que a nivel de código parece inservible pero cuando estemos en el caso de uso
Pagar un Viaje, probablemente en ese momento no sabremos cuál es el método de pago,
y necesitemos ingresar un dato lo suficientemente genérico que conceptualmente nos dé
la información que necesitamos, en este caso que es un Payment. Este es un tipo de
Polimorfismo y uno de los principios SOLID del software que obedece a la Inyección
de Dependencias. Lo veremos más adelante a detalle.

Ahora nos faltará crear las clases y aplicar su herencia.

Reto 4 30/37
Nos queda la Jerarquía Account pendiente.

Tomando como referencia nuestros diagramas. Plásmala en tu lenguaje de


programación favorito.Compártenos tus resultados.

Encapsulamiento 31/37
El Encapsulamiento es hacer que un dato sea inviolable, inalterable cuando se le asigne
un modificador de acceso.
El encapsulamiento es hacer que un dato sea inviolable, inalterable cuando se le asigne
un modificador de acceso (no se trata solo de ocultar el dato sino también de
protegerlo). Un modificador de acceso define el alcance y visibilidad de un miembro de
clase.La encapsulacion es también llamada ocultamiento de información.//Algunos
beneficios de encapsulación son:

 Controlar la manera en que los datos son accedidos o modificados


 El código es mas flexible y fácil de cambiar a partir de nuevos requerimientos
 Poder modificar una parte del código sin afectar otras partes del mismo
 Ayuda a mantener la integridad de los datos//Nota: esta información la obtuve de
la app SoloLearn (en donde puedes aprender diferentes lenguajes de
programación).

Encapsulando atributos en Java 32/37

Encapsulando atributos en Java

Cuando no se define un modificador de acceso, Java internamente asigna el


modificador default.

Añadir un modificador de acceso en Java:

private Integer passenger;

Getters y Setters: son métodos que permiten acceder y modificar un dato que esta
protegido por un modificador de acceso.

 Creando un gettter:
 public IntegergetPassenger() { // Integer → Tipo de dato que
va a retornar el método
 return passenger;-
 }

 Creando un setter:
 publicvoidsetPassenger(Integer passenger) { // void → Indica que
el método no va a retornar nada.
 this.passenger = passenger;
 }

El getter permite acceder al dato protegido, mientras que el setter permite


modificar dicho dato. Al ser ambos métodos de tipo public estarán disponibles
desde cualquier lugar. A la hora de llamar estos métodos, no cambio nada, el
proceso es el mismo que al llamar a cualquier otro método.

Usar getters y setter es particularmente útil no sólo para proteger datos, sino
también para validarlos:

publicvoidsetPassenger(Integer passenger) {

if (passenger == 4) {

this.passenger = passenger;

}else {

System.err.println("⚠ Necesitas asignar por lo menos 4


pasajeros");

PD: si quieren implementar lo que dijo la profe Anahí y validar que las variables de la
Clase Car no sean null pueden hacer los siguiente:

voidprintDataCar() {

if (license !=null && driver !=null && passenger !=null) {

System.out.println("License: " + license + " - Driver: " +


driver.name + " Passengers: " + passenger);

}else {

System.err.println("⚠ Aegurate de completar todos los


campos");

Generando polimorfismo en Java 33/37


Polimorfismo: Muchas formas. Poli = muchas, morfismo = formas. NO es
Poliformismo

Es construir métodos con el mismo nombre pero con comportamiento diferente


Generando polimorfismo en PHP 34/37
no me interesa php

El Diagrama UML de Uber 35/37


Este es el diagrama que finalmente obtuvimos, aquí solo faltaría añadirle los atributos
que posee cada clase.

Recopilemos todo lo que hemos aprendido para explicar los últimos detalles.

En primer lugar notarás que tenemos 3 tipos de flechas:

Asociación

Como su nombre lo dice, notarás que cada vez que esté referenciada este tipo de flecha
significará que ese elemento contiene al otro en su definición. Si recuerdas la clase Car,
este contenía una instancia de Driver. La flecha apuntará hacia la dependencia.

Herencia

Siempre que veamos este tipo de flecha se estará expresando la herencia.En nuestro
diagrama tuvimos al menos tres familias conviviendo. La dirección de la flecha irá
desde el hijo hasta el padre.

Familia Car
Familia Account

Familia Payment

Composición

Pasemos a una de nuestras piezas claves, pues notarás en el centro del diagrama la clase
Trip que está vinculada a User, Car, Route y Payment. La composición va a significar
una asociación entre estas clases con la diferencia de que para que esta clase pueda vivir
forzosamente necesita a las demás. Es decir que estas clases son obligatorias para que la
clase Trip pueda existir, esta dependencia obligatoria podríamos expresarla en el
método constructor de la clase Trip, pues para que un objeto pueda ser creado
dependerá de que los demás existan.

Esta clase Trip poseerá la lógica más fuerte del negocio aquí será donde se concentrarán
la mayor cantidad de clases.

Esto es todo nuestro diagrama de clases, que quedó totalmente expresado en nuestro
proyecto.

Conclusiones 36/37
Bonus: Qué es la Programación
Orientada a Objetos 37/37
Qué es la programación Orientada a Objetos: Curso de programación

EXÁMEN:
1. La programación orientada a objetos nos ayuda a programar más rápido

Verdadero
2. El código espagueti es uno de los problemas que resuelve la programación
orientada a objetos. ¿De qué se trata?

Código con demasiados if anidados

3. El paradigma orientado a objetos resuelve la necesidad de modelar un problema


en _________ y plasmarlo en ________.

Objetos, código

4. Estos son dos pilares de la programación orientada a objetos.

Abstracción y Herencia

5. ¿Qué significan las siglas UML?

Unifed Modeling Language

6. ¿Cuál es la definición de un objeto?

Una instancia de una clase

7. ¿Qué es una clase?

Son los modelos sobre los cuales construiremos objetos

8. ¿Cuál sería la abstracción de el siguiente ejemplo? Casa de 3 recámaras y 2


baños y Apartamento de 2 recámaras y 1 baño.

Inmueble

9. La modularidad nos permite tener independencia en el código y evitar colapsos


de software.

Verdadero

10. En un sistema de ventas de autos ¿cuál de estas opciones describe mejor los
objetos involucrados?

Auto, Vendedor, Cliente

11. ¿Cuál es la palabra reservada para definir una clase en Java?

class

12. Los atributos de un objeto deben ser:

sustantivos
13. Si entre clases tengo muchos atributos en común que son redundantes lo mejor
es aplicar:

Herencia

14. Tenemos una tienda online que vende blusas, jeans, medias, smartphones,


audífonos, computadoras y pantallas. Si ejecutamos un análisis POO y aplicamos
herencia, ¿cuáles serían las clases padres?

Ropa y AparatoElectronico

15. ¿Cuál es la palabra reservada para definir una clase en Python?

class

16. ¿Cuál es el famoso método que nos permite generar la inicialización de un


objeto?

constructor

17. ¿Qué es un objeto?

La instancia de una clase

18. ¿Cuál es la principal característica de los métodos constructores?

Tienen el mismo nombre de la clase

19. ¿Cuál de estos sí es un método constructor en Python?

__ init__()

20. ¿Cuál es la palabra clave para aplicar herencia en PHP?

extends

21. Una forma de encapsular código es haciendo invisible ciertas variables para
otros miembros:

Verdadero

22. ¿Cuál es el modificador de acceso más restrictivo de todos y genera mayor


encapsulamiento?

private

23. ¿Cuál es el la verdadera ventaja de usar polimorfismo?

Poder añadir o cambiar el comportamiento de un model

También podría gustarte