Descarga la aplicación para disfrutar aún más
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.
Compartir