Sei sulla pagina 1di 5

Práctica 4 - Gestión de asignaturas

21414 - Programación Orientada a Objetos

1. Introducción
El objetivo de esta práctica es implementar el diseño del Seminario 4 para
la gestión de asignaturas. La primera parte de la práctica consiste en definir
las clases necesarias para almacenar los datos de entrada. La segunda parte
consiste en añadir los métodos necesarios para poder satisfacer pedidos aso-
ciados con las asignaturas.

El archivo P4.zip contiene una clase Administracion que encapsula las


demás clases. Además hay una serie de archivos XML que representan la
entrada del programa. El programa ya se puede compilar y ejecutar, aunque
las listas de profesores, alumnos, etc. relativas a los pedidos están vacı́as,
ya que todavı́a no se guardan los datos de entrada en ninguna parte. Si
se especifica un paquete para la práctica, hay que añadir un argumento en
Execució → Establir configuració projecte → Personalitzar, en la
lı́nea Arguments. Por ejemplo, si el paquete es mis.objetos el argumento
debe ser mis/objetos (reemplazando los puntos por barras).

Esta práctica es obligatoria y la solución se ha de entregar en la página


de la asignatura en el Aula Global. El plazo para la entrega es el viernes
3 de diciembre a las 12h. Los archivos a entregar son 1) el código fuente
de las clases del proyecto, es decir, los archivos .java; y 2) una memoria
describiendo la implementación de la práctica.

2. Listas y la clase Object


En esta práctica se usarán listas para guardar colecciones de datos. En
Java existe una clase llamado LinkedList que representa a listas. Igual que
para arrays, se especifica el tipo de dato que se guardará. Por ejemplo, la
siguiente instrucción declara una variable lista cuyo tipo es lista de String:
LinkedList<String> lista;
También hay que inicializar la variable antes de usarla:
lista = new LinkedList<String>();
Para añadir un elemento a una lista se usa el método add:
lista.add(”Elemento”);
En Java, todas las clases son subclases de la clase Object. Por lo tanto,
cada clase hereda los métodos de Object. En particular, la clase Object tiene

1
un método llamado toString() que convierte una instancia de cualquier
clase a un String.
En la clase Administracion existen dos métodos llamados getObject y
listaToString que se pueden aprovechar en la práctica. El primer método,
getObject, tiene un String (llamado desc) y una lista como argumentos, y
devuelve el elemento de la lista cuya transformación por medio de toString
iguala desc. El método listaToString tiene una lista como argumento
y devuelve una lista de String que resulta de aplicar toString a cada
elemento de la lista de entrada.
Para aprovechar estos dos métodos es necesario sobreescribir el método
toString en las clases que representan las entidades de la universidad. Para
profesores, alumnos y asignaturas se usa el nombre para describir una enti-
dad, mientras que para aulas se usa el código.

3. Almacenar los datos de entrada


La primera parte de la práctica consiste en almacenar los datos de en-
trada. De esta primera parte, el primer paso es definir las clases del diseño
del Seminario 4. Para ayudar con la definición de las clases se dispone del
siguiente diagrama:

Profesor Alumno
1 1
0..* 0..*
Asignacion 0..* 0..* Matricula
1 1
Asignatura
1
0..*
Clase 0..*
1
Aula

La notación “0..*” indica que una instancia de una clase puede estar asociada
con cualquier número de instancias de la otra clase. La intención es usar listas
para representar este tipo de relación entre clases.
Una vez definidas las clases, se ha de crear atributos que almacenan las
entidades de la universidad. Como no se sabe de antemano cuantas entidades
hay, estos atributos también deben ser listas. Los atributos se deben declarar
al final de la clase Administracion y inicializarse en el constructor.
El método agregarDato es donde se deberı́a crear las instancias de las
clases. La clase Administracion incluye un método que interpreta la en-
trada en formato XML y lo convierte en un array de String, que se pasa

2
como argumento al método agregarDato. El primer elemento de este array
siempre es igual a uno de los siguientes valores:

”profesor”: el dato a agregar es un profesor. En la segunda posición


del array aparece el nombre del profesor.

”alumno”: el dato a agregar es un alumno. En la segunda posición del


array aparece el nombre, y en la tercera posición el NIA.

”asignatura”: el dato a agregar es una asignatura. En la segunda posi-


ción del array aparece el nombre de la asignatura.

”aula”: el dato a agregar es una aula. En la segunda posición del array


aparece el código del aula.

”clase”: el dato a agregar es una clase. Las demás posiciones del array
especifican el código del aula, el nombre de la asignatura, la franja
horaria, el tipo de clase y el grupo.

”matricula”: el dato a agregar es una matrı́cula. Las demás posiciones


del array especifican el nombre del alumno, el nombre de la asignatura
y el grupo.

”asignacion”: el dato a agregar es una asignación. Las demás posiciones


del array especifican el nombre del profesor, el nombre de la asignatura
y los grupos. El tamaño del array puede ser diferente dependiendo del
número de grupos a cuales está asignado el profesor.

Para convertir una variable s de tipo String a un número entero se puede


aplicar el método Integer.parseInt(s).
Para clases, matrı́culas y asignaciones (las clases asociación), es necesario
encontrar instancias concretas de las entidades asociadas, por dos razones:

1. Se tiene que especificar las instancias de entidades al crear una instan-


cia de la clase asociación.

2. Se tiene que añadir una instancia de la clase asociación a las instancias


de entidades asociadas.

Para encontrar instancias de las clases entidades se puede aprovechar el


método getObject de la clase Administracion. Eso requiere que las clases
entidades sobreescriben el método toString de la clase Object.
Para que los datos también aparezcan correctamente en las listas de la
aplicación de pedidos, es necesario cambiar la implementación de los méto-
dos listaProfesores, listaAlumnos, listaAsignaturas y listaAulas de
la clase Administracion. Estos métodos deben devolver listas de String,

3
representando el nombre o el código de la entidad correspondiente. Para im-
plementar estos métodos se puede aprovechar el método listaToString.

Se garantiza que los datos son únicos, y que no hay ningún conflicto
(ningún profesor tiene que dar dos clases en la misma franja horaria, etc.)

4. Pedidos
La segunda parte de la práctica consiste en satisfacer pedidos de varios
tipos relativos a las asignaturas. Se considerarán tres tipos de pedidos adi-
cionales con respecto al seminario:

Tipo Argumentos Descripción


AsignaturasDeAlumno alumno ¿En qué asignaturas está ma-
triculado un alumno?
ProfesoresDeAsignatura asignatura ¿Cuáles son los profesores de
una asignatura?
AsignaturasDeAula aula ¿Para qué asignaturas se dan
clases en una aula?
AlumnosDeProfesor profesor, franja ¿Qué alumnos deberı́an asis-
tir a la clase de un profesor
en una determinada franja ho-
raria?
AulaDeProfesor profesor, franja ¿En qué aula un profesor debe
impartir una clase en una de-
terminada franja horaria?
ProfesorDeAlumno alumno, asig- Dada una asignatura y un
natura, tipo tipo de clase (teorı́a, práctica,
seminario), ¿cuál es el profe-
sor de un alumno?
AulaDeAlumno alumno, franja ¿En qué aula un alumno
tiene clase en una determina-
da franja horaria?
ProfesorDeAula aula, franja ¿Cuál es el profesor que im-
partirá clase en una aula en
una determinada franja ho-
raria?
AlumnosDeAula aula, franja ¿Qué alumnos tienen clase en
una aula en una determinada
franja horaria?

Para satisfacer pedidos es necesario cambiar la implementación del méto-


do satisfacer de la clase Administracion. El argumento de satisfacer

4
es un array de String cuyo primer elemento es uno de los tipos de pedido
(”AsignaturasDeAlumno”, ”ProfesoresDeAsignatura”, etc.). Los siguientes
elementos del array corresponden a los argumentos de la tabla aquı́ arriba.

Para cada tipo de pedido, la segunda parte del nombre (“DeAlumno”,


“DeProfesor”, etc.) indica la clase donde se tiene que implementar el méto-
do correspondiente. Para encontrar una instancia de esta clase a la cual hacer
el pedido, se puede aprovechar el método getObject. Los demás argumentos
del pedido se tendrán que pasar como argumentos al método correspondi-
ente.

Por ejemplo, para satisfacer el pedido “AsignaturasDeAlumno”, primero


se tiene que buscar una instancia de la clase Alumno que corresponde al
nombre en el argumento del pedido. A esta instancia se tiene que llamar
a un método getAsignaturas sin argumentos, ya que este pedido no tiene
más argumentos que el alumno.

Potrebbero piacerti anche