BBDD&POO

Bases de Datos y
Programación Orientada a Objetos.

Curso: 2018/19. Parte POO
Máster en Modelización Matemática, Estadística y Computación

You can see this page translated into english by Google. Vous pouvez voir cette page traduite en français par Google.
(optimizado para Chrome)

Calendario

Octubre
LMMJV
[4]12345
[5]8
17:00-19:00
(0.19S)
9
17:00-19:00
(0.19S)
101112
[6]15
12:00-14:00
(0.26)
16171819
[7]2223242526
[8]293031  
Noviembre
LMMJV
[8]   12
[9]56789
[10]1213
17:00-19:00
(0.19S)
14
15:00-17:00
(0.19S)
1516
[11]192021
17:00-19:00
(0.19S)
22
15:00-17:00
(0.19S)
23
12:00-14:00
(0.27)
[12]2627282930
Diciembre
LMMJV
[13]3
17:00-19:00
(0.19S)
4
15:00-17:00
(0.19S)
5
15:00-17:00
(0.19S)
67
[15]10
15:00-17:00
(0.19S)
11
17:00-19:00
(0.19S)
12
15:00-17:00
(0.19S)
13
12:00-14:00
(0.19)
14
[15]1718192021
 N  no lectivo,  N  fiesta,  N  estudio,  N  exámenes, NN BBDD, NN POO, nuestra clase.

Programa

Temario

Evaluación

Entrega de ejercicios en primera convocatoria: 25/1/2019; en segunda convocatoria: 5/7/2019.

Método de entrega:

Nota: antes de entregar el ejercicio hay que -por lo menos- "adecentar" el código fuente. Lo correcto sería incluso escribir la documentación embebida, pero sin duda hay que dejar el código "listo para revista": eliminar ficheros abandonados, lineas de código de prueba, etc...

Ejercicio Propuesto para la primera convocatoria

El ejercicio propuesto, con los datos a utilizar, puede descargarse aquí. Consiste básicamente en definir una clase que "soporte" referencias bibliográficas en objetos, y generar multiples objetos de esa clase almacenándolos en en uno de tipo colección, para terminar generando unas tablas adecuadas a la base de datos con la información acumulada. Esas tablas deberían poder ser leidas fácilmente con una instrucción SQL. Hay dos detalles a tener en cuenta:
  • Como la información de cada referencia no llega en bloque, no pueden construirse los objetos inicializados completamente con toda la información, sino que lo razobable será inicializarlos vacíos y disponer de la posibilidad de añadirles los datos que se van obteniendo posteriormente. La colección que los almacene debe permitir un acceso sencillo a ellos para esta necesidad de añadir información cada vez que se disponga de un dato nuevo.
  • Cuando la entrada se haya procesado completamente, la generación de las tablas resultado puede ser muy sinple en algunos casos y no tanto en otros, requiriendo de estructuras intermedias para elaborarse
La calificación del ejercicio se hará de 0 a 10. Si se presenta además una segunda variante del ejercicio que realice la conexión y envío directo de los datos a la base de datos, se podrá obtener una puntuación extra a sumar a la obtenida con el original.

Ejercicio Propuesto para la segunda convocatoria

El ejercicio propuesto, con los datos a utilizar, puede descargarse aquí. Trabajaremos con datos idénticos a los de la primera convocatoria, pero en cierto modo a la inversa.
En este caso damos por hecho que los datos se encuentran en las tablas de la base de datos, y con ellos podemos proporcionar posteriormente determinadas "vistas" de los mismos o resultados de consultas desde Java. Para no tener que "montar" la base de datos y solicitarle las tablas, se proporcionan los ficheros asociados a cada tabla (el resultado del ejercicio de primera convocatoria).
El trabajo consiste básicamente en definir una clase que "soporte" a cada fichero (sus campos serán las columnas, y cada fila dará lugar a un objeto). Una vez obtenidos todos los datos pueden realizarse diversas "vistas" (combinaciones en nuevas tablas, es decir nuevas clases). La propuesta es hacer un par de ellas:
  • vista de instituciones con el número de autores que pertenecen a ellas. (es decir, tabla: filiación(F) - número_de_autores_de_F)
  • vista de pares de autores que han colaborado al menos en una publicación y el número de artículos en común (es decir, tabla: autor & autor – número de artículos en común)
Si se presenta una variante del ejercicio que monte la base de datos y le solicite las tablas en lugar de leerlas de ficheros, se calificará sobre 12 (truncando en 10). Si las vistas generadas se hacen ordenadas por número de autores en el primer caso, y por número de artículos en el segundo, se podrán obtener hasta 2 puntos extra a sumar a la obtenida con el original (truncando en 10).

Desarrollo

OCTUBRE

Lunes 8 de octubre de 2018

TEMA 0 - Introducción

Necesitaréis el entorno de desarrollo de Java (JDK - Java Development Kit). Ha salido hace medio mes la versión JDK11, pero nos vamos a quedar con la JDK8 porque en un año se han sucedido las 9, 10 y 11, donde han introducido unas variaciones estructurales que no nos interesan, y por lo visto, además de esto se están dando actualizaciones demasiado frecuentes.
Descargad de aquí.
Veréis esto

Aceptáis la licencia, descargáis la versión para vuestra máquina, y ejecutáis la instalación.

Además usaremos como entorno de ayuda al desarrollo (IDE) el de Netbeans (es el que mejor se adapta a nuestras necesidades siendo 100% gratuito). De nuevo nos quedamos con la versión 8 aunque la 9 haya salido ya. La 9 se adapta a los cambios de JDK9 pero ha perdido por el camino funcionalidades de la 8 (ha pasado de ser desarrollado por Oracle -la compañia propietaria de Java- a ser desarrollado por la Fundación Apache, y en el paso ha habido adaptaciones que ralentizan la obtención de todas las funcionalidades)
Descargad de aquí.
Veréis esto

Elegid vuestro tipo de máquina y el idioma (preferiblemente inglés para evitar malas traducciones, pero si no estáis muy habituados con el vocabulario del desarrollo de software quizás no sea mala opción que elijáis el que mejor os vaya).
Todas las versiones son la misma con más o menos características que pueden añadirse o eliminarse posteriormente una vez instalado. La que nos conviene de entrada es la JavaSE.
De nuevo, descargáis e instaláis. No debe haber ningún problema.
Martes 9 de octubre de 2018

TEMA 1 - Elementos básicos del lenguaje

Obtención del número Pi mediante aproximación por serie.

Se trata de calcular el número π con precisión de cuatro decimales mediante la serie:

La especificación de cuatro decimales hace referencia al criterio de parada en la suma de términos de la serie, no a la presentación de la solución, que se hará normalmente mediante System.out.println(.) y que nos mostrará un número de decimales que no podemos controlar por ahora.

Una solución:
public static double pi() {
        double pi = 0.0;
        for (int i = -1; i <= 100_000_000; )  pi += 2.0/(i+=2)/(i+=2);
        return pi*4;
    }

Los programas que se utilizan para calcular PI con un número de decimales extremadamente alto utilizan series evolucionadas a partir de la sorprendente fórmula descubierta por Ramanujan en 1910 y demostrada no hace mucho tiempo:

Su convergencia es exponencial y ya el primer término aporta 6 decimales. Puede ser un buen ejercicio utilizar esta fórmula para el cálculo de PI, aunque enseguida se verá que es "demasiado buena" para lo que podemos hacer con variables primitivas (e incluso con otros recursos que nos aporta Java).

Algunos consejos usando este ejercicio... (video)
Obtención de números Perfectos

Escriba una RUTINA que determine si un número dado es perfecto o no.

static boolean isPerfect(long n) {
            //TODO hacer lo necesario para que "isPerfect" retorne "true" o "false" si n es perfecto o no.
            }

Un número perfecto es un entero positivo igual a la suma de sus divisores propios. Los divisores propios de un entero positivo son todos sus divisores a excepción de sí mismo. (Ejemplo de número perfecto: el 6, porque sus divisores propios son 1, 2 y 3 y 6=1+2+3.)

Utilizando dicha rutina debera obtener una lista de números perfectos entre el 1 y el 100.000

Resultado de la ejecución:
6 = 1+2+3
28 = 1+2+4+7+14
496 = 1+2+4+8+16+31+62+124+248
8128 = 1+2+4+8+16+32+64+127+254+508+1016+2032+4064

Listado de Números Perfectos [pdf]

DICIEMBRE

Martes 3 de diciembre de 2018

TEMA 2 - Elementos relacionados con la Orientación a Objetos

Martes 4 de diciembre de 2018

TEMA 3 - Mecanismo de control de Excepciones y Errores

Miercoles 5 de diciembre de 2018
  • Desarrollaremos un caso práctico para ejercitar todo lo visto.
    Aquí el proyecto Netbeans
    Es ligeramente diferente al desarrollado en clase porque se ha quedado en el ordenador del aula. Las diferencias serán mínimas.
    El error no corregido en clase consistia en que faltaba inicializar las variables rows y columns llamando a super(.,.) desde el constructor de DenseMatrix, y por tanto faltaba también escribir el constructor Matrix(.,.). Como quiera que en la suma y en la conversion a String haciamos los ciclos for hasta getRows() y getColumns(), al estar las correspondientes variables a cero, no se hacía nada.
Lunes 10 de diciembre de 2018

TEMA 4 - Biblioteca de Clases

Para seguir desarrollando nuestro ejemplo "con fundamento" necesitamos adentrarnos en las bibliotecas de Java
(con fundamento, pero sin olvidar que es sólo un ejemplo de desarrollo. No pretende ser eficaz en ningún sentido)

  • Un vistazo general a las bibliotecas
  • Material de biblioteca de uso general (java.lang y java.util) -Imagen resumen-
    • Empezamos con Object, ha de tenerse en cuenta... siempre forma parte de nuestra herencia (ejemplo++)
    • System, es la máquina sobre la que se ejecuta el programa...
    • Otras clases en java.lang, son básicas e interesantes.
    • Clases en java.util, no son "imprescindibles", pero a poco que hagamos las necesitaremos.(ejemplo++)
    • Las colecciones (aplicable el for "iterativo" -es un patrón-)
      (en las colecciones se usan intensivamente los "Genéricos" aquí un "tutorial"
  • Algunas otras clase de interés (muy por encima):
    • Formatter (en java.util facilita métodos en String y en Streams de salida entre otras clases)
    • Scanner (en java.util pero muy usada con streams de entrada)(ejemplo++)
    • Pattern y Matcher(en java.util.regex -expresiones regulares- facilita métodos en String y otras clases)
Aquí el proyecto Netbeans
  • Se ha cambiado MatrixException para considerarla una extensión de RuntimeException (no de Exception), de modo que no sea obligado atenderla (como cualquier otra excepción aritmética)
  • Como consecuencia de lo anterior se han podido eliminar todas las declaraciones de "throw Exception" en el interfaz BasicAlgebra, y en sus implementaciones
  • También se han añadido en MatrixException los dos constructores que aceptan un Throwable por conveniencia de los setters indicados en el punto anterior
  • Se ha añadido en Matrix un setter protegido para "mutable" de modo que las clases hijas puedan alterar su valor
  • Se han introducido un get y un set abstractos en Matrix para transmitir la obligación de permitir el acceso a los elementos de la matriz, y se han reescrito en las subclases. Estos métodos permitiran hacer cieratas operaciones de manera "abstracta" (a nivel de Matrix).
  • También se han añadido en MatrixException los dos constructores que aceptan un Throwable por conveniencia de los setters indicados en el punto anterior
  • Se ha declarado que Matrix implementa Cloneable, y se ha reescrito el método clone() correspondiente.
  • En DenseMatrix
    • Se han reescrito los métodos equals(.), clone(), y hashCode(), heredados de Object.
    • El método toString() heredado de Object ya estaba hecho, pero concatenando Strings, por lo que se ha "corregido" usando StringBuffer.
  • En SparseMatrix.
    • Se ha añadido una clase interna (Value) para soportar los elemenos distintos de cero, representados por {fila,columna,valor}
    • El estado de la matriz se define como una colección de tipo List con implementación ArrayList de elementos Value
    • Se ha introducido un constructor para la matriz "cero" con dimensiones filas × columnas
    • Se ha introducido un instanciador a partir de un fichero con un formato predeterminado. Usa un Scanner sobre un Stream (se verá mañana). En el subdirectorio "[proyecto]/data" hay un fichero para pruebas (sm1.txt)
    • Se ha añadido un método toDense() que devuelve la matriz densa equivalente. Es utilizado en varios puntos para simplificar el código, aunque es algo altamente ineficaz y debería ser reemplazado (su uso) para una versión eficiente
Martes 11 de diciembre de 2018
  • Material de biblioteca de uso específico (sólo java.IO en nuestro caso) -Imagenes resumen: 1, 2, 3-
    • Un vistazo general en pizarra:
      • los Streams soportados por las clases de cuatro sub-árboles del árbol de herencia.
      • El patrón "Wrapper".
    • Otras clases File, RandomAccessFile
    • El paquete java.nio aporta más material de IO (buffers, canales, etc)
  • También es interesante saber hacer interfaces gráficos, pero no disponemos de tiempo para ello. GUIs con Swing, GUIs con JavaFX. O utilizar hilos para aprovechar toda la potencia de nuestra máquina. O trabajar frente a Internet. Y tantas otras cosas...
    Nos limitaremos a hablar del acceso a bases de datos por las caracteristicas del curso. Eso es el siguiente tema.

TEMA 5 - Capas de aplicación y Bases de Datos

Ejercicio práctico
Haremos un procesamiento de datos ejercitando los conocimientos generales adquiridos -en particular los de lectura de ficheros-, y probaremos también el acceso a una base de datos
  • Los ficheros de texto a procesar son los del alineamiento fonético de voz y actas de las sesiones del Parlamento Vasco de los días: 1, 11, 14, 15 de diciembre de 2017. No es preciso "bajarlos", accederemos a ellos directamente desde el programa.
  • Es necesario el driver JDBC para MySQL
  • La base de datos se ha construido con:
    create database actaspv;
    use actaspv;
    CREATE TABLE estadisticas (
      `id` VARCHAR(8) NOT NULL,
      `numPalabras` INT NOT NULL,
      `validas` INT NOT NULL,
      `media` DOUBLE NOT NULL,
      `desviacionTipica` DOUBLE NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE INDEX `id_UNIQUE` (`id` ASC));
                              
  • Una solución como proyecto Netbeans, y su javadoc.

Extras

"Not So Frequently Asked Questions"

En ocasiones alguna pregunta nada habitual puede ser de interés general....