BBDD&POO
Bases de Datos y
Programación Orientada a Objetos.
Curso: 2023/24. Parte POO
Máster en Modelización e Investigación Matemática, Estadística y Computación
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
N no lectivo, N fiesta, N estudio, N exámenes, NN POO, (NN BBDD). |
Dadas las características de este curso (la limitación del número de horas y encontrarse asociado "de algún modo" a las Bases de Datos)
El enfoque va a ser diferente al clásico para el aprendizaje desde cero de los conceptos de la Orientación a Objetos, que sería básicamente
aprender un lenguaje "ordenadamente". Vamos a plantear un par de casos generales a resolver con Orientación a Objetos que pueden ser de interés.
Usaremos un lenguaje adecuado (Java) pero con un cierto (des)orden ligado a los casos planteados.
Esta manera de proceder, sin serlo exactemante (porque deberámos plantear muchos casos más simples), podemos aproximarla loq ue se conoce como
"problem solving"... podemos mencionar a Elon Musk, ya que está de moda ahora, como un defensor destacado del mismo: lo explicaba en
este video.
Pensando en el uso de la programación con Orientación a Objetos en relación con el manejo de bases de datos (BBDDs) en ciencia y tecnología vamos a plantear dos casos: la construcción de interfaces gráficos (GUIs - Graphic User Interface) específicos para acceso a BBDDs, y el procesamiento de datos en bruto para adaptarlos a los requerimientos de una BBDD:
Ejercicio propuesto
La propuesta es desarrollar una pequeña aplicación con un GUI que permita obtener con facilidad datos que requieren de queries más o menos complejas predefinidas.
Para que todos trabajemos con la misma base de datos, ésta se construirá ejecutando el proyecto desarrollado en clase
(se carga en Netbeans con la opción File->import. Poned en la conexión con la base de datos vuestro usuario y clave de MySql -en el constructor, que se encuantra al final de DBMummec2324-).
La idea base puede ser algo así como lo que muestra la figura:
En este ejemplo vemos un JFrame con tres paneles con tabuladores de modo que en cada panel se proporciona un tipo de búsqeda en la base de datos. El que está seleccionado es el que permite obtener el número de artículos y el "factor de productividad" de los autores cuyo nombre coincida con el indidcado en el campo de texto. La query puede ser tan compleja como sea necesaria para obtener directamente la tabla mostrada, o bien el programa puede resolver el problema haciendo varias queries más sencillas y componiendo la tabla por partes. En el caso de la imagen, podría ser que primero se localizasen los autores, y después para cada autor se obtengan los valores de número de artículos e "indice de productividad" con consultas consecutivas a la base de datos
En la siguiente imagen podemos ver una "pestaña" de utilidad que permite enviar cualquier consulta. En el caso anterior se lanza la consulta al pulsar la tecla "enter" tras escribir en el campo de texto, pero en este caso, al tratarse de un área de texto la tecla "enter" no provoca inigún evento y por eso se ha dispuesto un botón para enviar la petición.
Quiero dejar claro que la propuesta no es "cerrada": podéis plantear qué "servicio" dar, es decir qué información va a permitir obtener la aplicación. Junto a al proyecto (File->export, con el proyecto seleccionado) debéis entregar un pequeño escrito que oriente a la hora de entender que "servicio" proporciona por si la aplicación no es del todo autoexplicativa (otra opción es incluir un "help" en algún punto -p.ej. en una barra de menú.).
Noviembre
Introducción: planteamiento del curso basado en el desarrollo de dos casos. Herramientas a utilizar. Inicio del desarrollo del caso 1, con introducción de los conceptos de Clase y Objeto, Herencia, polimorfismo, etc.
Para diseñar el JFrame nos ayudamos de este material:
Generar un nuevo proyecto con Netbeans [5 min.]
Iniciar un GUI con Netbeans [8 min.]
Emplazamiento de componentes en GUIs [pdf]
How to Use Various Layout Managers
Componentes gráficos para el GUI [24 min.] ← herencia
Layout managers [27 min.]
Hemos visto la demo de Swing y comenzado a usar Netbeans para entender clase/objeto y tener una primera aproximación a la herencia. Hemos comenzado con el emplazamiento de componentes quedando pendiente ver porqué aparece "java.awt" delante de los nombres de las clases, lo que nos lleva a la biblioteca de clases y documentación, que ha quedado pendiente.
jdk-8u202-windows-x64.exe jdk-11.0.20_windows-x64_bin.exeDiciembre
Continuación del desarrollo del caso 1 hasta completarlo.
Hemos continuado con la disposición de componentes, aprendiendo sobre bibliotecas y documentación, y hemos desarrollado un interfaz de calculadora. Deberíamos de haber terminado con todo esto, pero nos falta mucho aún. En todo caso, hemos visto cosas que permitirán ir más rápidos con el segundo caso.
El plan era 👇 ***Vamos absolutamente fuera de plazo, aunque hemos visto cosas que permitirán ir más rápidos con el segundo caso***
Planteamiento del caso 2 e inicio del estudio de los elementos necesarios previamente: Tipos de datos, operadores y sentencias de Java; concreción de la Herencia y el Polimorfismo.
Para "dar vida" a nuestro GUI nos ayudamos de estos materiales:
Comunicación entre componentes de AWT y Swing [pdf]
donde vemos el patrón "Delegation Event Model" ("Observer")
(Patrones en Wikipedia)
Interacción con el GUI [32 min.] ← uso del polimorfismo
Antes de pasar a lo siguiente, no dejaremos de ver cómo decir "Hola Mundo" en Java
Hemos visto todo esto aunque nos falta dedicar 2 minutos a finalizar el "HolaMundo".
Continuación del estudio de los elementos necesarios para el desarrollo del caso 2: creación y estructura de Objetos y Clases, encapsulamiento, etc. Tratamiento de errores...
Avanzamos el enunciado del ejercicio a desarrollar (aunque primero deberemos aprender algunas cosas)
Enunciado
Vamos a procesar datos de referencias bibliográficas que se tienen en un fichero con una determinada estructura y cierto desorden. El fichero puede desacargarse de https://gtts.ehu.es/German/Docencia/assets/DB.txt o ser accedido directamente desde esa dirección por el programa.
Analisis de los datos:
Observando las primeras lineas del fichero veremos datos bibliográficos (obtenidos de scholar.google.es) donde cada línea aporta un dato,
que estará precedido por un número de referencia asignado previamente, y un carácter que indica el tipo de dato (t=título, y=año, p=publicación, r=referencias, a=autor, l=link).
La información correspondiente a autores(a) puede aparecer varias veces, de modo que en cada ocasión se referirá a un autor y
llevará siempre asociada la filiación del mismo entre comillas.
El número de referencia y el carácter que indica el tipo de información van juntos y seguidos por un
espacio en blanco. El número de referencia no tiene una longitud determinada.
No hay un orden predeterminado para las líneas, de modo que la información referente a los distintos artículos podrá
intercalarse sin restricciones. Tampoco se asegura que todos los campos de un mismo artículo aparezcan seguidos, sino que
puede haber cierto desorden en este sentido.
Observacion:
Una referencia bibliográfica podrá estar completa o no. En concreto, puede que no haya referencias o "link" para algunos registros.
En el caso de la falta de referencias bastará con ignorarlo (simplemente no aparecerán referencias en la tabla correspondiente de la base de datos a generar),
y en el caso del "link", en el campo correspondiente de la tabla deberá decir "UNKNOWN".
Objetivos:
Tendremos que (1) asimilar del mejor modo posible toda esa información, y (2) almacenarla posteriormente en una base de datos con las tablas mostradas más abajo.
Estrategia:
Para el objetivo 1: definiremos una clase que "soporte" referencias bibliográficas, cada una en un objeto,
y según éstos se vayan generando, iremos almacenándolos en una colección.
Para el objetivo 2: dada la estructura de tablas de la base de datos,
cumplimentaremos cada una de ellas mediante métodos de una clase que sea la responsable de interaccionar con ella.
Información necesitaremos para el desarrollo del ejercicio que se ha planteado:
Bueno... pues hemos visto ese enunciado del caso que resolveremos y los temas indicados.
Continuación: Atención a la herencia de Object en el desarrollo de clases. System y otras clases básicas de utilidad. Introducción a las Colecciones.
Información necesitaremos para el desarrollo del ejercicio que se ha planteado:
Henos visto (muy rápido) lo indicado aquí arriba
Inicio del desarrollo del caso 2, con estudio de Colecciones concretas y Entradas/Salidas.
Información necesitaremos para el desarrollo del ejercicio que se ha planteado:
Hemos echado un vistazo a la idea del ejercicio de evaluación (próximamente el enunciado y un video en la sección "evaluación"), y comenzado a plantear y escribir el código del caso 2 (el proyecto se subirá a esta web cuando terminemos), lo que nos ha llevado a ver las colecciones.
Continuación del desarrollo del caso 2 hasta completarlo.
Hemos visto los dos puntos de arriba segun hemos avanzado en el desarrollo del ejercicio, que ha quedado en el punto en que debemos ir interaccionando con la nueva clase que se encarga del acceso a la base de datos
Ejercicio personal (o en grupo) en clase: Procesamiento con Bases de Datos.
Hemos continuado con el ejercicio generando el esquema de la base de datos y algunas tablas, pero no lo hemos completado para tener la oportunidad de hablar cuando menos de la clase Object, que hay que conocer por ser madre de cualquiera otra que escribamos. El ejercicio completo se puede descargar de la zona donde expongo el ejercicio de evaluación de esta parte de la asignatura.
- System es la clase que representa al sistema en que corre nuestra aplicación. Contiene tres objetos: in, out y err, que son la entrada estándar, la salida estándar y la salida de error respectivamente (cuando hacíamos System.out.println("Hola mundo"); hacíamos uso de esta clase). Además de estos tres objetos encontramos métodos que nos proporcionan utilidades básicas del sistema: movimiento de bloques de memoria, acceso a variables del entorno y propiedades del sistema, etc. (pinchad el enlace para ver la documentación)
- java.util es el paquete de utilidades básicas, del cual veíamos las colecciones en la segunda página del pdf que se obtiene al pinchar en el enlace. En la primera página hay una presentación del resto de clases "variopintas" donde no pocas son interesantes.
- Las Enumeraciones son unas clases "un poco especiales" porque tienen la característica añadida de que en su propia definición se incluye la generación de un conjunto limitado de objetos que serán los únicos existentes (es una clase con un dominio de valores(objetos) predefinido) En muchisimas ocasiones, de hecho, lo único que contiene una enumeración es la enumeración (valga la redundancia) de los objetos que se predefinen. En el pdf que se obtiene siguiendo el link tenéis un ejemplo muy claro de esto.
- Cuando comenzamos a hablar de clases, dijimos que una definición de una clase se hacia en "su fichero correspondiente", pero luego fuimos relajando esa restricción y vimos que puede definirse más de una si sólo todo lo más una es pública. Más adelante, en el ejercicio, hemos escrito una clase interna -la excepción-, y en el video que explica cómo rellenar de datos una JTable os hablo de las clases anónimas. El pdf que se obtiene al pinchar en Visión general de la definición de Clases pretende mostrar todo esto (es un poco farragoso)
ADENDA: Al desarrollar el ejercicio, os comenté que en la documentación podemos encontrar como parámetro de una función una clase generica donde el tipo puede estar totalmente abierto a cualquier clase (<?>) o limitado a la descendencia de una clase dada (<? extends K>) o a su ascendencia (<? super K>). El caso es que nos encontramos con <? extends String> y os comenté que "algo raro estaba pasando" ya que String es una clase final y por tanto no le encontraba sentido. No caí en la cuenta de que la documentación que vemos en Netbeans cuando nos da posibilidades de escritura no es la genérica, sino que ya está adaptada a los tipos declarados. La función admite de modo genérico un subárbol y por tanto no está mal indicar <? extends String>, lo que sucede es que en este caso no hay otra posibilidad que admitir únicamente objetos de clase String.