Sesión Teórica #08 POO con C# (II) PDF

Summary

Estas notas resumen la sesión teórica #08 sobre programación orientada a objetos (POO) en C#. Se discuten colecciones, arrays y listas, incluyendo ejemplos y conceptos de programación.

Full Transcript

{ Sesión Teórica #08 POO con C# (II) } Seminario de Lenguajes I ASC - PUC - LSI FCEQyN - UNaM Agenda Revisión de algunos 01 Una nota al margen conceptos a cons...

{ Sesión Teórica #08 POO con C# (II) } Seminario de Lenguajes I ASC - PUC - LSI FCEQyN - UNaM Agenda Revisión de algunos 01 Una nota al margen conceptos a considerar. 02 Clases relacionadas Motivación y ejemplos Desarrollo de un Continuación del 03 caso ejercicio previo. 04 Cierre Resumen general. 01 { Colecciones en C# < Un repaso previo a su uso > } Tipos de Colecciones { Estáticas Dinámicas Pueden comenzar con una En su definición se establece su capacidad capacidad determinada y y, generalmente, no posteriormente } pueden ser ampliarla o reducirla redimensionadas. según sea necesario. Colecciones en C# Inicialmente se puede mencionar que existen los arrays. Los mismos se pueden utilizar para manejar una estructura uni, bi o multidimensional de datos. Se los define como estructuras estáticas. Colecciones en C# Para algo más avanzado, se cuenta con otras estructuras como listas, pilas y colas. En este caso, se trata de una colección dinámica que permite agregar o quitar elementos de la misma. Detalles sobre los arrays Declaración (opciones): Detalles sobre los arrays Acceso a posiciones (opciones): Detalles sobre los arrays Lo mismo aplica a matrices: Detalles sobre las listas Se define una clase para almacenar: Detalles sobre las listas Se opera con la lista y los objetos: Pero entonces… ¿Cuándo usamos una u otra estructura? ¿Y si tengo objetos? Algún lineamiento (?) Arrays: cuando se sabe el número exacto de elementos a guardar y se requiere más performance. Ejemplo: datos de tiempo de ejecución para cuestiones de uso. Listas: cuando se necesita una colección que pueda modificar sus dimensiones dinámicamente o por simplicidad de uso. Algún lineamiento (?) Escenario Enfoque Ventajas Necesita cambiar el Eficiente para cambios tamaño de un array de tamaño específicos unidimensional, se Array.Resize conoce el nuevo tamaño de antemano Necesita administración Flexible, fácil de usar dinámica de Lista colecciones Necesita un control Redimensionamiento Flexible, personalizable máximo sobre el manual con una nueva cambio de tamaño matriz 02 { Relacionando clases < Cuando tienen que vincularse > } Cuál sería el motivo El mismo escenario podría implicar generar objetos que van a estar relacionados entre sí. Una clase, podría tener como atributo a un conjunto de objetos de otra clase. Esta segunda clase deberá almacenarse en algún tipo de colección. Vamos con unos ejemplos Buscando registrar: Movimientos de una cuenta bancaria que se almacenan para obtener su saldo. Ingresos / Egresos de un producto para calcular su stock. Detalle de las filas de una factura o ticket para calcular su importe total. ¿Cómo queda? Visualmente ¿Cómo queda? En código ¿Cómo queda? En código ¿Cómo queda? En código ¿Cómo queda? En código Se reemplaza el atributo _saldo por una propiedad, lo que hace que lo podamos omitir Se agrega una lista de Movimientos Una propiedad realiza el cálculo ¿Cómo queda? En código 03 { Desarrollo de un Caso < Mejoremos nuestro ejercicio > } Ejercicio #02 Tomando como base la clase Producto desarrollada en la sesión anterior, implementar una clase complementaria para marcar los ingresos y egresos de stock. Realizar una implementación similar al ejemplo de esta presentación para su gestión. Implementar una solución con una serie de controles básicos para brindar comportamiento. 04 { Cierre de la sesión < Resumen de la sesión de hoy > } Cierre En esta sesión trabajamos en más detalle con la definición de clases y objetos en C#. Se llevó adelante la implementación de una clase que se vincula con otra que contendrá sus objetos a partir de algún tipo de colección. Se observó como estos cambios pueden afectar al comportamiento definido. En las próximas sesiones vamos a trabajar más a fondo con otras cuestiones como herencia y polimorfismo. Fin < Por ahora... > CREDITS: This presentation template was created by Slidesgo, and includes icons by Flaticon, and infographics & images by Freepik { Sesión Teórica #10 POO con C# (III) } Seminario de Lenguajes I ASC - PUC - LSI FCEQyN - UNaM Agenda Revisión del ejemplo que 01 Ver detalles se viene desarrollando. Tomando como punto de 02 Armado de un CRUD partida el ejemplo. Convirtiendo el ejemplo 03 Desarrollo del caso en un CRUD. 04 Cierre Resumen general. 01 { Detalles del caso < Un repaso de cómo venimos > } Dos Clases { Producto Movimiento Registro de datos Datos básico y una lista para todos los básicos como para movimientos que dan complementar a los } lugar a su stock productos. actual. Dos Operaciones Están implementadas: Creación de un producto Creación de uno o más movimientos para ese producto Un par de cambios Se modificó la interfaz Un par de cambios Se agregó una lista general y un objeto temporal para trabajar (ya vamos a ver cómo) en el Formulario: Un par de cambios Se modificó el método para cargar un producto: Un par de cambios Se modificó el método para cargar un producto: Se agrega el producto generado en la lista del formulario Se sincroniza el ListBox usado para mostrar los datos Un par de cambios Se modificó la clase Producto para tener un método ToString(): Override es la palabra reservada para hacer la reimplementación del método (aplicando el concepto de polimorfismo). Un par de cambios Se modificó el método para cargar un movimiento: [...] Un par de cambios Se modificó el método para cargar un movimiento: Se obtiene el producto generado desde la lista del formulario (necesita modificación) [...] Se sincroniza el ListBox usado para mostrar los datos Un par de cambios Este es el método para cargar el contenido de la lista del formulario al control ListBox para mostrar los productos: Un par de cambios Este es el método para cargar el contenido de la lista del formulario al control ListBox para mostrar los Se vacía el control para productos: volver a cargarlo Se recorre la lista y se cargan sus elementos en el ListBox (usando implícitamente el método ToString() de la clase Producto) 02 { Implementando un CRUD < O algo básicamente parecido > } ¿Qué es un CRUD? Se denomina así a una funcionalidad para gestionar datos de una entidad, implica las siguientes operaciones: CREATE READ UPDATE DELETE Algunas consideraciones Particularidades de nuestro caso: Todo va a estar en una sola pantalla (podría estar separado en varias) No estamos usando persistencia (los datos quedan en memoria) El control ListBox no nos brinda mucha funcionalidad, sería cambiado por otro más adelante Algunas consideraciones Particularidades de nuestro caso: Nos vamos a manejar con la paridad entre índices de la lista que tenemos en el formulario y la colección de Items del ListBox Eso quiere decir que para seleccionar un objeto para editar / eliminar se va a usar el selectedIndex del ListBox == índice del objeto en la lista Algunas consideraciones Particularidades de nuestro caso: Podríamos agregar una búsqueda por ID de producto Falta implementar algunos controles para no tener stock negativo Se tiene que ajustar a qué Producto se van a estar agregando movimientos 03 { Desarrollo del Caso < Implementación del CRUD > } No empezamos de cero En el repositorio de código de la Teoría tienen una carpeta con la solución ya implementada hasta el mismo punto de partida a usar acá. Tareas a realizar El trabajo de hoy: Manejar el funcionamiento con varios Productos y sus Movimientos Implementar las operaciones de edición y eliminación Implementar una búsqueda por ID de producto Agregar algunas validaciones 04 { Cierre de la sesión < Resumen de la sesión de hoy > } Cierre En esta sesión we put all things together para sacar un CRUD usando clases, objetos y colecciones. Si bien es una aproximación básica y tiene cosas por mejorar, es la base de cuestiones más complejas a implementar. Nuestro camino desde acá: Manejo de errores / excepciones [24/06] Herencia + Polimorfismo [01/07] 2do Parcial [08/07] 2do. Recuperatorio [11/07] Fin < Por ahora... > CREDITS: This presentation template was created by Slidesgo, and includes icons by Flaticon, and infographics & images by Freepik { Sesión Teórica #11 Errores y Excepciones en C# } Seminario de Lenguajes I ASC - PUC - LSI FCEQyN - UNaM Agenda Algunas cuestiones de 01 Introducción arquitectura. Uso de las excepciones y 02 Control de errores recursos del lenguaje. Mejora de nuestro CRUD 03 Ejemplo con CRUD implementado anteriormente. 04 Cierre Resumen general. 01 { Introducción < Dónde se ubica este tema > } Dos Conceptos { Errores Excepciones Son eventos que Son flujos o resultados no esperados en el interrumpen la comportamiento del ejecución del producto. } producto. Si no son Sirven para controlar controlador llevan a un errores que pudieran estado irrecuperable. ser identificados previamente. Control de Errores Un par de observaciones Por ahora, nosotros no tenemos una capa de datos (persistencia). El control de errores se realizaría en una clase que implementa la lógica de negocios de la aplicación. Ante un error se genera una excepción. En el código de la interfaz (nuestros formularios) se tienen que capturar las excepciones y brindar un curso de acción. Un par de observaciones Tampoco tenemos, hasta ahora, un controlador de errores. Es algo a integrar cuando se pase a definir excepciones personalizadas y la gestión de logs de la aplicación. A medida que una aplicación crece / evoluciona estas cuestiones se vuelven necesarias y es conveniente al menos implementarlas básicamente desde un inicio. Un par de ejemplos Casos para control de excepciones podrían ser: División por cero Intentar abrir un archivo que no existe Valor negativo en un ticket / factura Acceder a una posición inexistente de una colección Entre otros 02 { Generando excepciones < Controlando errores > } ¿Cómo hace esto C#? El control de excepciones usa las palabras clave try, catch y finally para realizar o controlar situaciones como: Acciones que pueden no completarse correctamente Controlar errores Limpiar recursos cuando corresponda ¿Cómo hace esto C#? El origen de las excepciones puede ser: La Common Language Runtime (CLR) El framework.NET en sí Bibliotecas de terceros El código de aplicación Las excepciones se crean mediante el uso de la palabra clave throw. Algunas consideraciones Una excepción se puede producir tanto en un método al que el código ha llamado directamente, como desde otro método más bajo en la pila de llamadas. La pila se arma con estas llamadas sucesivas Algunas consideraciones Cuando se genera una excepción, la CLR recorre la pila y busca un método con un bloque catch para el tipo de excepción específico y ejecuta el código de ese primer bloque catch que encuentra. Algunas consideraciones Si no encuentra ningún bloque catch adecuado en cualquier parte de la pila de llamadas, finalizará el proceso y mostrará un mensaje al usuario. La sintaxis La sintaxis Una función de división Si el segundo parámetro es cero la división no es matemáticamente posible Entonces se lanza (throw) una excepción específica La sintaxis El bloque try que contiene lo que se desea ejecutar y controlar Se coloca el código donde se podría generar un error El bloque catch permite capturar una o más excepciones Cuando se captura una excepción se ejecuta código para brindar feedback A tener en cuenta Observaciones: Si no hay ningún catch para una excepción determinada, el programa deja de ejecutarse con un mensaje de error. Cada excepción se tiene que controlar y dejar la aplicación en un estado consistente. Si se captura una excepción genérica System.Exception, se puede reiniciar con la palabra clave throw al final del bloque catch. A tener en cuenta Observaciones (cont.): En un bloque catch se puede definir una variable de excepción (del tipo capturado) para tener información sobre el error. Los objetos de excepción pueden contener una descripción del error lo que da pie a la personalización de los mensajes al usuario. A tener en cuenta Observaciones (cont.): Según el caso, se puede sumar un bloque finally para definir código a ejecutarse independientemente de cómo haya finalizado el bloque try-catch. Los tipos comunes de excepciones se pueden observar acá. Un ejemplo Se tiene un array de números enteros y un valor de un índice del que se quiere recuperar el valor. El problema va a estar si se quiere acceder a una posición no válida del array. Un ejemplo El método para obtener el valor de una posición del array En el bloque try se hace la operación directamente En caso de error se va a capturar la excepción de índice fuera de rango y se guarda en una variable Un ejemplo Dado que la excepción se capturó, se lanza otra ya que estamos en un método interno Además, en la nueva excepción se utiliza la propiedad Message para pasar un mensaje de error a la capa superior (junto con toda la pila previa, en la variable e) Un ejemplo En el bloque try se hace la invocación a la función que recupera el valor En el bloque catch se captura la excepción generada en el método y se guarda en la variable e Se muestra un mensaje de error y se agrega el mensaje de la excepción capturada Modificado usando finally Mismo escenario, pero se agrega un bloque finally para informar al usuario que la ejecución finaliza y en qué estado. Para esto se va a usar una variable de tipo Exception para saber si ocurrió un error en la ejecución. Modificado usando finally Se declara la variable ex para saber si hay o no una excepción En el bloque catch se asigna a ex el valor de la excepción controlada En el bloque finally se controla el valor de ex y se informa en consecuencia al usuario 03 { Desarrollo del Ejemplo < Continuamos con nuestro CRUD > } Qué vamos a hacer Tomando el proyecto de control de inventario de las sesiones previas, vamos a incorporar un control de errores a algunas operaciones pendientes. Continuamos con la solución que fue actualizada en el repositorio de código de la teoría después de la clase 10. Tareas a realizar El trabajo de hoy: Implementar una búsqueda por ID de producto (pendiente de la vez anterior) Agregar el control de errores en la asignación de stock negativo por una venta mayor al disponible 04 { Cierre de la sesión < Resumen de la sesión de hoy > } Cierre En esta sesión incorporamos una herramienta para el manejo de errores de nuestras aplicaciones. Esto es de gran importancia para evitar “cuelgues” y mejorar la experiencia del usuario, brindando un producto de mayor calidad. Lo que resta hasta el final del cuatrimestre: Manejo de errores / excepciones [24/06] Herencia + Polimorfismo [01/07] 2do Parcial [08/07] 2do. Recuperatorio [11/07] Fin < Por ahora... > CREDITS: This presentation template was created by Slidesgo, and includes icons by Flaticon, and infographics & images by Freepik { Sesión Teórica #12 Herencia y Polimorfismo C# } Seminario de Lenguajes I ASC - PUC - LSI FCEQyN - UNaM Agenda 01 Introducción Un repaso rápido. Herencia y Cómo aplicarlos en el 02 Polimorfismo lenguaje. Implementación en 03 Ejemplos nuestro ejemplo de referencia. 04 Cierre Resumen general. 01 { Introducción < Dónde se ubica este tema > } Repaso de los Conceptos { Herencia Polimorfismo Un mismo método puede Se aplica un esquema de jerarquías de clases, tener diferente donde una clase “hija” comportamiento según el } deriva de una clase objeto que lo “padre” y “hereda” implemente. atributos y métodos. Gráficamente Gráficamente Clase general con sus atributos y métodos Clases hijas de la general que heredan sus atributos y métodos Gráficamente Las clases hijas pueden re-implementar los métodos heredados manteniendo su nombre (polimorfismo) Clases hijas también pueden implementar sus propios métodos (y sumar sus atributos) 02 { Herencia y polimorfismo en C# < Aplicando lo anterior > } Herencia Particularidades + Implementación Alguna descripción La herencia es uno de los atributos fundamentales de la programación orientada a objetos. Permite definir una clase secundaria que reutiliza (hereda), amplía o modifica el comportamiento de una clase primaria. La clase cuyos miembros son heredados se conoce como clase base. La clase que hereda los miembros de la clase base se conoce como clase derivada. Alguna descripción C# y.NET solo admiten herencia única. Es decir, una clase sólo puede heredar de una clase única. Sin embargo, la herencia es transitiva, lo que le permite definir una jerarquía de herencia para un conjunto de tipos. Vista gráfica La herencia no es completa Los siguientes miembros no se heredan: Constructores estáticos. Constructores de instancias, a los que se llama para crear una nueva instancia de la clase. Cada clase debe definir sus propios constructores. Finalizadores, llamados por el recolector de elementos no utilizados en tiempo de ejecución. La herencia no es completa Si bien las clases derivadas heredan los miembros de una clase base, que dichos miembros estén o no visibles depende de su accesibilidad. La accesibilidad afecta la visibilidad de cada elemento en las clases derivadas: Privado = No (salvo anidadas) Publico = Sí Protected = Sí Más info La sintaxis La sintaxis Una clase base para formas geométricas Dos clases derivadas para una forma en particular, en el nombre se indica que hereda de Forma con el signo “:” Las clases derivadas tienen los mismos componentes de la clase base como si fueran propios Polimorfismo Particularidades + Implementación Alguna descripción Una clase derivada hereda de una clase base todos sus miembros. Los miembros virtuales proporcionan opciones para modificar el comportamiento de la clase derivada: Invalidar los miembros virtuales de la clase base, y definir un comportamiento nuevo. Definir una nueva implementación no virtual de esos miembros que oculte las implementaciones de la clase base. Alguna descripción Una clase derivada puede invalidar un miembro de la clase base si este se declara como virtual o abstracto. Los atributos no pueden ser virtuales. El miembro usa la palabra clave override para indicar explícitamente que el propósito del método es participar en una invocación virtual. La sintaxis La sintaxis Los métodos que pueden ser invalidados se declaran como virtuales en la clase base En la clase derivada, se indica que es una invalidación con la palabra reservada override Opcionalmente, en la implementación modificada se puede incluir una llamada al método original En ejecución En ejecución La salida tiene la ejecución de la clase derivada y de la base (por la llamada incluida) En ejecución Ambas implementaciones generan resultados esperables 03 { Desarrollo del Ejemplo < Continuamos con nuestro CRUD > } Qué vamos a hacer Tomando el proyecto de control de inventario de las sesiones previas, vamos a incorporar un control de errores a algunas operaciones pendientes. Continuamos con la solución que fue actualizada en el repositorio de código de la teoría después de la clase 10+11. Tareas a realizar El trabajo de hoy: Aplicar herencia para definir un tipo específico de excepción para el control de stock. Determinar si existe algún caso aplicable de polimorfismo para el escenario planteado. 04 { Cierre de la sesión < Resumen de la sesión de hoy > } Cierre En esta sesión finalizamos con el uso de los conceptos que son pilares de la POO. En diferentes contextos será necesario encontrar el uso particular para cada uno, quedando esto a criterio del equipo / desarrolladores. Lo que resta hasta el final del cuatrimestre: Manejo de errores / excepciones [24/06] Herencia + Polimorfismo [01/07] 2do Parcial [08/07] 2do. Recuperatorio [11/07] Fin < De todo el contenido teórico de la asignatura > CREDITS: This presentation template was created by Slidesgo, and includes icons by Flaticon, and infographics & images by Freepik

Use Quizgecko on...
Browser
Browser