Logo Studenta

07 Semana_7_Dart_Avanzado_iii

¡Este material tiene más páginas!

Vista previa del material en texto

Semana 7: Dart Avanzado (iii)
Facultad de Ingeniería de Sistema e Informática
LENGUAJE DE PROGRAMACIÓN V
Ing. Angel Marthans Ruiz, Mg.
Objetivos: 
Al finalizar, el alumno logrará:
 Conocer las propiedades avanzadas de los enumeradores.
 Implementar manejo de errores e el código.
 Conocer el concepto de concurrencia en Dart.
 Conocer el concepto de Streams.
2
Temas:
 Enumeradores
 Manejo de errores
 Concurrencia y Futures
 Streams
3
Enumeradores
4
Los enums de Dart son subclases de la clase Enum. Eso significa que usted puede hacer muchas 
de las mismas cosas a los enums que usted haría con una clase, incluyendo la adición de 
propiedades y métodos, la implementación de interfaces y el uso de mixins y genéricos.
Enumeradores
5
¿Para qué se usan los Enums?
Los Enums son útiles cuando tienes un número fijo de opciones que quieres representar. Aquí 
algunos ejemplos:
 Estados de las luces del semáforo (rojo, ámbar, verde)
 Días de la semana (lunes, martes, miércoles, …)
 Meses del año (enero, febrero, marzo, …)
 Estados de una lista de reproducción (reproduciendo, pausado, …)
 Tipos de climas (soleado, lluvioso, …)
Enumeradores
6
Todos estos temas son más o menos constantes. La gente no va a añadir un octavo día de la 
semana a corto plazo. Del mismo modo, sólo hay un número finito de estados de reproducción 
de audio. Se podría argumentar que hay un número indeterminado de tipos de tiempo, pero si 
has pensado cuidadosamente tu aplicación meteorológica, probablemente tengas un conjunto 
limitado para el que necesitas mostrar iconos.
Por otro lado, cuando una categoría tiene cambios frecuentes o un número ilimitado de 
posibilidades, no es una gran elección para los enums. Aquí tienes algunos ejemplos de cosas 
que probablemente no deberías representar con un enum: 
• Usuarios
• Músicas
• URLs
Enumeradores
7
Antes era común 
escribir este tipo de 
código
Sin embargo, este tipo de lógica 
plantea algunos problemas:
• La función toma cualquier valor 
entero, asi que nada te impide 
pasar un valor incorrecto de otra 
variable.
• El compilador no sabe que solo 
hay 3 opciones posibles, asi que 
no puede advertirte de algún 
error si le pasas un valor distinto 
de 0, 1 o 2.
Enumeradores
8
Enumeradores
9
Tratando Enums como clases
Los Enums son clases, y sus valores son instancias de 
la clase. Esto quiere decir que podemos aplicar 
nuestros conocimientos de clases. Podemos agregar 
Constructores y Propiedades:
Manejo de errores
1 0
Código sin manejo de errores, que genera 
una excepción al ejecutar.
La aplicación deja de funcionar debido al 
error (crash)
Manejo de errores
1 1
Código con manejo de errores, que genera una 
excepción al ejecutar.
Bloque Try…Catch implementado.
La aplicación no deja de funcionar. Muestra el 
mensaje de error y continua ejecutándose.
Manejo de errores
1 2
Implementamos el manejo de excepciones de 
forma específica y con un mensaje personalizado.
Manejo de errores
1 3
Implementamos el manejo de excepciones 
múltiples.
Manejo de errores
1 4
Implementamos el manejo de excepciones 
agregando el bloque finally.
Manejo de errores
1 5
Implementamos el manejo de excepciones 
personalizadas
Manejo de errores
1 6
Concurrencia y Futures
1 7
Las tareas de larga duración suelen clasificarse en dos categorías: Tareas de E/S y tareas de 
cálculo intensivo. Las de E/S, o entrada-salida, incluyen la lectura y escritura de archivos, el 
acceso a una base de datos o la descarga de contenidos de Internet. Todas ellas ocurren fuera 
de la CPU, por lo que ésta tiene que esperar a que se completen. Por otro lado, las tareas de 
cálculo intensivo se realizan dentro de la CPU. Estas tareas pueden incluir el descifrado de datos, 
la realización de cálculos matemáticos o el análisis sintáctico de JSON.
Concurrencia y Futures
1 8
Como desarrollador, debes tener en cuenta cómo responderá tu aplicación, y en particular tu 
interfaz de usuario, cuando se enfrente a estas tareas que requieren mucho tiempo. Te imaginas 
que un usuario pulsara un botón de descarga en tu aplicación y esta se congelara hasta que se 
completara la descarga de 20 MB?
Un hilo es una secuencia de comandos que ejecuta un ordenador. Algunos lenguajes de 
programación admiten el multithreading (ejecución simultánea de varios hilos), pero otros no.
El Paralelismo y la Concurrencia son palabras que significan casi lo mismo, pero en 
programación existe una distinción entre ellas.
Concurrencia y Futures
1 9
Como desarrollador, debes tener en cuenta cómo responderá tu aplicación, y en particular tu 
interfaz de usuario, cuando se enfrente a estas tareas que requieren mucho tiempo. Te imaginas 
que un usuario pulsara un botón de descarga en tu aplicación y esta se congelara hasta que se 
completara la descarga de 20 MB?
Un hilo es una secuencia de comandos que ejecuta un ordenador. Algunos lenguajes de 
programación admiten el multithreading (ejecución simultánea de varios hilos), pero otros no.
El Paralelismo y la Concurrencia son palabras que significan casi lo mismo, pero en 
programación existe una distinción entre ellas.
Concurrencia y Futures
2 0
El paralelismo es cuando varias tareas se ejecutan al mismo tiempo en varios procesadores o 
núcleos de CPU; la concurrencia es cuando varias tareas se turnan para ejecutarse en un único 
núcleo de CPU. Cuando en un restaurante una sola persona se alterna para tomar los pedidos y 
limpiar las mesas, eso es concurrencia. Pero un restaurante en el que una persona toma los 
pedidos y otra limpia las mesas, eso es paralelismo.
Concurrencia y Futures
2 1
En la siguiente imagen, puedes ver múltiples tareas ejecutándose en dos hilos en paralelo. Un 
rectángulo representa cada tarea, y los rectángulos más largos representan las tareas de mayor 
duración. Una línea plana representa un estado inactivo en el que el hilo no está haciendo nada:
Concurrencia y Futures
2 2
La siguiente imagen muestra las mismas tareas ejecutándose simultáneamente en un único 
subproceso:
Concurrencia y Futures
2 3
La versión simultánea tarda un poco más, pero no mucho más. La razón es que los hilos paralelos 
estuvieron inactivos durante gran parte del tiempo. Un único hilo suele ser más que suficiente 
para realizar lo que hay que hacer.
Flutter tiene que actualizar la interfaz de usuario 60 veces por segundo. Cada rebanada de 
tiempo de actualización se denomina fotograma.
Eso deja unos 16 milisegundos para redibujar la interfaz de usuario en cada fotograma. 
Normalmente no se tarda tanto, lo que da tiempo a realizar otras tareas mientras el hilo está 
inactivo. El usuario no notará ningún problema mientras ese trabajo no impida a Flutter actualizar 
la interfaz de usuario en el siguiente fotograma. El truco está en programar tareas durante los 
tiempos de inactividad del hilo.
Concurrencia y Futures
2 4
Código Síncrono vs Código Asíncrono
El código síncrono ejecuta cada instrucción en orden, una línea de código inmediatamente 
después de la anterior.
Esto contrasta con el código asíncrono, el código asíncrono reprograma ciertas tareas para 
ejecutarlas en el futuro cuando el hilo no esté ocupado.
Concurrencia y Futures
2 5
El bucle de eventos
Dart utiliza lo que llama un bucle de eventos para ejecutar tareas que habían sido pospuestas.
El bucle de eventos utiliza una estructura de datos llamada cola. Piense en una cola como 
esperar en la cola de la tienda de comestibles. Cuando te pones a la cola por primera vez, te 
colocas al final de la cola. Luego, poco a poco, te vas colocando al principio de la cola a medida 
que la gente que te precede se va marchando. El primero de la fila es el primero en irse. Por esta 
razón, los desarrolladores llaman a una cola una estructura de datos FIFO (primero en entrar, 
primero en salir).
Concurrencia y Futures
2 6
El bucle de eventos tiene dos colas: una cola de eventos y una cola de microtareas. La cola de 
eventos es para eventoscomo que un usuario toque la pantalla o que lleguen datos de un 
servidor remoto. Dart utiliza principalmente la cola de microtareas internamente para dar 
prioridad a ciertas tareas pequeñas que no pueden esperar a que las tareas de la cola de 
eventos terminen.
Concurrencia y Futures
2 7
Utilizarás la clase Future para observar el bucle de eventos añadiendo tareas a las colas de 
eventos y microtareas. Pasar un bloque de código a Future hace que Dart ponga ese código en 
la cola de eventos en lugar de ejecutarlo sincrónicamente.
Código síncrono
Código asíncrono
Concurrencia y Futures
2 8
Ejecución de código síncrono después de una tarea de 
cola de eventos
A veces, es posible que se desee realizar una tarea 
inmediatamente después de que finalice una tarea de la 
cola de eventos.
El método then de una instancia de Future ejecutará una 
función anónima inmediatamente después de que se 
complete el futuro. Este código es síncrono.
Cuando los futuros se completan con éxito, devuelven un 
valor.
Concurrencia y Futures
2 9
Retrasar intencionalmente una tarea
A veces, es útil simular una tarea de larga duración. Puede lograr esto con Future.delayed, Dart 
agregará una tarea a la cola de eventos después de un tiempo.
Concurrencia y Futures
3 0
Estados para un futuro
Antes de que un futuro se complete, no hay nada que 
puedas hacer con él. Pero después de que se complete, 
tendrá dos posibles resultados: el valor que estaba 
solicitando o un error. Todo esto funciona en tres estados 
diferentes para un futuro: Incompleto, Completado con 
un valor, Completado con error.
Concurrencia y Futures
3 1
Usando Callbacks
Un Callback es una función anónima que se 
ejecutará después de que algún evento se haya 
completado. En el caso de los futures, existen 3 
oportunidades de Callback: then, catchError, y 
whenComplete.
Concurrencia y Futures
3 2
Un future te dará un valor o un error. Si se completa con un valor, puede obtener el valor 
agregando una devolución de llamada al método then. La función anónima proporciona el valor
como argumento para que pueda acceder a él. Por otro lado, si el futuro se completa con un 
error, puedes manejarlo en catchError. Pero independientemente de si el futuro se completa 
con un valor o un error, puede ejecutar cualquier código final en whenComplete.
Los Callbacks son relativamente fáciles de comprender, pero pueden ser difíciles de leer, 
especialmente si los anidamos. Una forma más legible de escribir nuestro código es usando la 
sintaxis Async-Await.
Concurrencia y Futures
3 3
Usando Async-Await
Concurrencia y Futures
3 4
Manejando errores potenciales
Un future representa un valor único que llegará en el futuro. Por otro lado, un stream representa 
múltiples valores que llegarán en el futuro. Se podría decir que un stream es una lista de futuros.
Los Streams se utilizan en Dart para:
• Leer un archivo grande almacenado localmente donde los nuevos datos del archivo vienen en 
fragmentos.
• Descargar archivos desde un servidor remoto.
• Escuchar solicitudes que llegan a un servidor.
• Representar eventos del usuario (clic a un botón)
• Transmitir cambios en el estado del app hacia la UI.
Streams
3 5
Streams
3 6
Leer como una cadena
Streams
3 7
Leer desde un Stream
Streams
3 8
Uso de un For‐Loop asíncrono
Streams
3 9
Manejo de errores usando Callback
Streams
4 0
Manejo de errores usando Try-Catch
Streams
4 1
Cancelando un Stream
Referencias:
 https://dart.dev/language/enum
 https://dart.dev/language/error-handling
 https://dart.dev/language/concurrency
 https://dart.dev/codelabs/async-await
 https://felinohost.com/dart/dart-future-async-await/
 https://dart.dev/tutorials/language/streams
 https://dart.dev/articles/libraries/creating-streams
4 2
https://dart.dev/language/enum
https://dart.dev/language/error-handling
https://dart.dev/language/concurrency
https://dart.dev/codelabs/async-await
https://felinohost.com/dart/dart-future-async-await/
https://dart.dev/tutorials/language/streams
https://dart.dev/articles/libraries/creating-streams
La manera de empezar es dejar de 
hablar y comenzar a actuar.
Walt Disney
4 3
	�����Semana 7: Dart Avanzado (iii)
	Objetivos: �Al finalizar, el alumno logrará:
	Temas:
	Enumeradores
	Enumeradores
	Enumeradores
	Enumeradores
	Enumeradores
	Enumeradores
	Manejo de errores
	Manejo de errores
	Manejo de errores
	Manejo de errores
	Manejo de errores
	Manejo de errores
	Manejo de errores
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Concurrencia y Futures
	Streams
	Streams
	Streams
	Streams
	Streams
	Streams
	Streams
	Referencias:
	La manera de empezar es dejar de hablar y comenzar a actuar.

Otros materiales

Materiales relacionados