BBDD&POO
Bases de Datos y
Programación Orientada a Objetos.
Curso: 2019/20. Parte POO
Máster en Modelización Matemática, Estadística y Computación
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
N no lectivo, N fiesta, N estudio, N exámenes, NN BBDD, NN POO, nuestra clase. |
Tema | Contenido |
0 | INTRODUCCIÓN |
1 | ELEMENTOS BÁSICOS DEL LENGUAJE - Introducción. - Tipos de datos, identificadores y literales. - Operadores. - Sentencias. |
2 | ELEMENTOS RELACIONADOS CON LA ORIENTACIÓN A OBJETO - Objetos y clases. - Estructura de la definición de una clase. - Herencia. - Encapsulamiento (ámbitos de accesibilidad). - El bloque static y los atributos static y final. - Instanciación, inicialización y eliminación de objetos. - Clases y métodos abstractos. - Interfaces. - Polimorfismo. - Enumeraciones. - Clases dentro de clases y métodos. Clases anónimas. - Arrays. |
3 | MECANISMO DE TRATAMIENTO DE EXCEPCIONES Y ERRORES - Introducción. - Control de excepciones. - Generación excepciones. - Definición de nuevas excepciones. - Aserciones |
4 | BIBLIOTECA DE CLASES (clases de interés) - Los paquetes java.lang y java.util. Genéricos y colecciones. - Clases para entradas y salidas |
5 | CAPAS DE APLICACIÓN Y BASES DE DATOS - El navegador como capa de cliente (HTML, javascript) y la capa de presentación (JSPs). - Acceso a bases de datos. |
Aquí el enunciado del ejercicio, y aquí el javadoc de una solución.
Entrega de ejercicios en primera convocatoria: 13/1/2020; en segunda convocatoria: 5/7/2020.
Método de entrega:
NOVIEMBRE
TEMA 0 - Introducción
Estas introducciones pretenden dar una aproximación muy general a la Orientación a Objetos, y poner en contexto y justificar el uso de Java como lenguaje para concretar. Son en cierto modo prescindibles ya que todo ello se concreta más adelante.
Sí que aparecen algunos datos/ideas/conceptos relacionados y de interés que no se volverán a tocar, pero también pueden obviarse si nos centramos en el objetivo de entender la Orientación a Objetos. Principalmente me estoy refiriendo con esto a las Máquinas Virtuales (la JVM -Java Virtual Machine- en nuestro caso y como precursora), y al patrón MVC de "estructuración" de aplicaciones
Las últimas páginas se dedican a las herramientas que usaremos, y su justificación y acceso para descargarlas se encuentra en el texto que se muestra a continuación.
Necesitaréis el entorno de desarrollo de Java (JDK - Java Development Kit).
Ha salido hace un mes la versión JDK13 (recientemente se ha establecido en 6 meses
el periodo de publicación de versiones -una técnica de desarrollo acual-).
De todos modos, aunque nos hagamos con esta versión, trabajaremos "a nivel" de la versión 7,
porque todas las actualizaciones desde entonces caen fuera del ámbito de este curso (en realidad, la versión 8
sería la mejor opción ahora mismo, pero sus capacidades funcionales nos pueden confundir en el IDE del que hablamos
más abajo).
Descargad e instalad de aquí.
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).
Descargad de aquí la última versión (11.2).
TEMA 1 - Elementos básicos del lenguaje
En este tema aprendemos todo lo necesario para programar en Java sin Orientación a Objetos (ignorando por el momento todo aquello que sí lo es y nos vemos obligados a incluir sin dominar). Para quien domine C encontrará más similitudes que diferencias (siempre a mejor). En general tampoco es muy diferente a programar en cualquier otro lenguaje imperativo. Es cuestión de "hacerse" con una sintaxis concreta.
Como puntos a destacar: la absoluta portabilidad de los tipos primitivos; algunos operadores no demasiado comunes: el ternario (cond ? exp1 : exp2
), los incrementos y decrementos
(++x, --x, x++, x--
), los combinados (+=, -=, %=,
etc.)
Como decíamos, hay ciertos elementos que se mencionan aquí aunque pertenecen al "mundo de los objetos" (operadores new
e instanceof
, o la sentencia throw
) que se estudiarán más adelante
//Nos quedamos viendo la lista de operadores...
//Continuamos donde lo dejamos...
El siguiente ejercicio lo dejamos planteado para resolverlo el próximo día en clase
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.
El siguiente ejercicio lo dejamos planteado "sin más", y veremos soluciones al finalizar el curso porque nos mostrará algunas capacidades "avanzadas" que nos permiten obtener más soluciones que las que están por ahora en nuestra mano.
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
Listado de Números Perfectos [pdf]
TEMA 2 - Elementos relacionados con la Orientación a Objetos
En este tema encontramos los conceptos importantes de la Orientación a Objetos. Todos son importantes, pero hay que destacar la Herencia, y más aún el Polimorismo.
//Echamos un vistazo al ejercicio del cálculo de Pi, y continuamos donde lo dejamos con el tema 2... ... y llegamos hasta ver el polimorfismo
DICIEMBRE
//Continuamos donde lo dejamos con el tema 2
TEMA 3 - Mecanismo de control de Excepciones y Errores
En este tema vemos una parte de Java que, siendo parte de la estructura básica del lenguaje, comienza a hacer uso de las capacidades que nos da la orientación a objetos. La gestión de errores obedece a un modelo de separación de caminos de éxito y resolución de problemas, que está soportada por el lenguaje mediante una sentencia específica así como por clases que heredan la capacidad de ser "arrojables"
TEMA 4 - Biblioteca de Clases
Hemos visto todo lo que se refiere al lenguaje (bueno, excepto el soporte puntual que da a un par de características con los términos "transient" y "volatil", las dos que nos quedan por marcar en el cuadro de palabras reservadas).
A partir de aquí todo son bibliotecas. Como ya se ha mencionado, el elenguaje es absolutamente incapaz de hacer nada sin bibliotecas, y se han usado desde el primer instante (System.out.println("Hola mundo");
).
Hemos de estudiar las clases imprescindibles, las de más frecuente uso, y las específicas para nuestros intereses particulares.
java.lang
y java.util
)
Object
, ha de tenerse en cuenta... siempre forma parte de nuestra herencia ... llegamos hasta ver el Object a falta de equals-hashcode-clone
//Continuamos donde lo dejamos con Object
java.lang
y java.util
)
Object
, ha de tenerse en cuenta... siempre forma parte de nuestra herencia System
, es la máquina sobre la que se ejecuta el programa... java.lang
, son básicas e interesantes. -Imagen resumen-java.util
, no son "imprescindibles", pero a poco que hagamos las necesitaremos.for
"iterativo" -es un patrón-)java.IO
en nuestro caso) -Imagenes resumen: 1, 2, 3-
File
, RandomAccessFile
java.nio.file
aporta más material de IO para trabajo con ficheros... llegamos a ver ina introducción mínima a IO explicando el patrón Wrapper
//Continuamos con una visión muy rápida de IO para pasar a hacer un ejercicio completo.
DROP DATABASE IF EXISTS actaspv; 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));
Exception in thread "main" java.sql.SQLException: Column count doesn't match value count at row 1
así que el número de datos (columnas) no coincide en la query sql con la tabla de la base de datos, por lo que hay que ver qué estamos enviando, es decir mostrar la query por pantalla:
public static void main(String[] args) throws IOException, SQLException { PVFile f = new PVFile("http://gtts.ehu.es/German/Docencia/assets/20171201.txt"); con.createStatement().executeUpdate( String.format( "insert into estadisticas (id, numPalabras, validas, media,desviacionTipica) values (%s, %d, %d, %.3f, %.3f)", "20171201", f.getNumeroDePalabras(), f.getNumeroDePalabrasValidas(), f.media(), f.desviacion()) ); }y lo que hacemos es construir la query con antelación, para mostrarla en la consola antes de enviarla a la base de datos
public static void main(String[] args) throws IOException, SQLException { PVFile f = new PVFile("http://gtts.ehu.es/German/Docencia/assets/20171201.txt"); String query = String.format( "insert into estadisticas (id, numPalabras, validas, media,desviacionTipica) values (%s, %d, %d, %.3f, %.3f)", "20171201", f.getNumeroDePalabras(), f.getNumeroDePalabrasValidas(), f.media(), f.desviacion() ); System.out.println(query); con.createStatement().executeUpdate(query); }Lo que observamos es esto:
insert into estadisticas (id, numPalabras, validas, media,desviacionTipica) values (20171201, 35892, 28287, 0,085, 0,052)
...osea que el método "format" de String (el objeto de clase Formatter que utiliza internamente) está configurado de tal modo que escribe el separador de decimales como una coma
(está configurado localmente, se comporta como es nuestra costumbre) y eso supone un problema con la sintaxis de SQL.
public static void main(String[] args) throws IOException, SQLException { PVFile f = new PVFile("http://gtts.ehu.es/German/Docencia/assets/20171201.txt"); con.createStatement().executeUpdate( String.format(Locale.UK, "insert into estadisticas (id, numPalabras, validas, media,desviacionTipica) values (%s, %d, %d, %.3f, %.3f)", "20171201", f.getNumeroDePalabras(), f.getNumeroDePalabrasValidas(), f.media(), f.desviacion()) ); }Si queremos hacer que en todo momento el comportamiento "local" sea el propio de UK (p.ej.) y evitar indicarlo cada vez que apliquemos un formato, podemos establecerlo inicialmente por defecto (ojo que afecta a más cosas, como por ejemplo el formateo de las fechas).
public static void main(String[] args) throws IOException, SQLException { Locale.setDefault(Locale.UK); PVFile f = new PVFile("http://gtts.ehu.es/German/Docencia/assets/20171201.txt"); con.createStatement().executeUpdate( String.format( "insert into estadisticas (id, numPalabras, validas, media,desviacionTipica) values (%s, %d, %d, %.3f, %.3f)", "20171201", f.getNumeroDePalabras(), f.getNumeroDePalabrasValidas(), f.media(), f.desviacion()) ); }Una vez que ya tenemos todo funcionando, podemos hacer que nuestro programa procese los cuatro ficheros mediante un ciclo "for" del siguiente modo:
public static void main(String[] args) throws IOException, SQLException { Locale.setDefault(Locale.UK); String[] filenames = {"20171201", "20171211", "20171214", "20171215"}; for (String filename : filenames) { PVFile f = new PVFile("http://gtts.ehu.es/German/Docencia/assets/"+filename+".txt"); con.createStatement().executeUpdate( String.format( "insert into estadisticas (id, numPalabras, validas, media,desviacionTipica) values (%s, %d, %d, %.3f, %.3f)", filename, f.getNumeroDePalabras(), f.getNumeroDePalabrasValidas(), f.media(), f.desviacion()) ); } }O un poco más directamente:
public static void main(String[] args) throws IOException, SQLException { Locale.setDefault(Locale.UK); for (String filename : new String[]{"20171201", "20171211", "20171214", "20171215"}) { PVFile f = new PVFile("http://gtts.ehu.es/German/Docencia/assets/"+filename+".txt"); con.createStatement().executeUpdate( String.format( "insert into estadisticas (id, numPalabras, validas, media,desviacionTipica) values (%s, %d, %d, %.3f, %.3f)", filename, f.getNumeroDePalabras(), f.getNumeroDePalabrasValidas(), f.media(), f.desviacion()) ); } }Aquí está el proyecto en formato "zip"