Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Java:
PHP
– Lenguaje interpretado
Python
– Múltiples usos: Web, Server Side, Análisis de Datos, Machine Learning, etc
Javascript–
-Lenguaje interpretado
C#
Ruby
Kotlin
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.
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.
**** 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.
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.
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.
Propiedades:
También pueden llamarse atributos serán sustantivos: nombre, tamaño, forma, estado.
No confundir con el valor, por ejemplo en un objeto libro tenemos 3 atributos, nombre,
color, tamaño:
Comportamientos:
Serán todas las operaciones del objeto, suelen ser verbos o sustantivo y verbo.
Clase:
Las Clases son los modelos sobres los cuales construiremos nuestros objetos.
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.
Reutilizar código.
Evitar colapsos.
Código más mantenible.
Mayor legibilidad
Rápida resolución de problemas.
Modularidad
Divide el programa en diferentes partes o módulos / clases
Separar las clases en archivos (buena práctica)
3- En la app hay un catálogo de autos para elegir(uber x / uber pool / uber black/ uber
van)
F- Trip: captura quien realiza el viaje, a donde vas, y como realizas el pago
Animal en adopcion
Rescatista
Adoptante
Donaciones
Proceso:
1- Identificar Problema
2- Identificar Objetos
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:
Durante el curso vamos a trabajar con 4 lenguajes, así se definen las clases en cada
uno
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 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
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
Objetos uber:
Otro más
En java necesitamos que el nombre de la clase sea el mismo que el del archivo
Creamos una nueva clase: account con sus atributos y también la clase car
Clase payment:
Ahora con python
Account
Car
Payment
Route
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.
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.
This hace referencia al objeto instanciado. Para comprender del todo esta última frase
mira la siguiente clase donde hablamos de objetos.
Vamos a la clase car (en su archivo correspondiente) y declaramos un método para traer
los datos de esa clase:
La clase Car quedaría así:
Notarás que para instanciar un objeto seguiremos usando la palabra clave new.
https://github.com/anncode1/Curso-POO-Platzi/tree/3.1.POOJS
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.
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.
Observa que estamos importando las dos clases que usaremos y las estamos
instanciando en los métodos constructores.
https://github.com/anncode1/Curso-POO-Platzi/tree/3.2.ConstructorPython
Creo el archivo de UberBlack y UberVan que son iguales, también solo difieren los
nombres
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í:
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.
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.
Reto 4 30/37
Nos queda la Jerarquía Account pendiente.
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:
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;
}
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 {
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() {
}else {
Recopilemos todo lo que hemos aprendido para explicar los últimos detalles.
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?
Objetos, código
Abstracción y Herencia
Inmueble
Verdadero
10. En un sistema de ventas de autos ¿cuál de estas opciones describe mejor los
objetos involucrados?
class
sustantivos
13. Si entre clases tengo muchos atributos en común que son redundantes lo mejor
es aplicar:
Herencia
Ropa y AparatoElectronico
class
constructor
__ init__()
extends
21. Una forma de encapsular código es haciendo invisible ciertas variables para
otros miembros:
Verdadero
private